Há certos cenários nos quais a migração de arquivos .mfmap não é suportada. Este tópico explica por que a migração não é automática nestas situações e fornece instruções sobre como concluir uma migração bem-sucedida.
O modelo de programação para mapas de mensagens é diferente entre a Versão 5.0 (na qual o formato de arquivo é .mfmap) e a Versão 6.0 (na qual o formato é .msgmap). Os mapas de mensagens da Versão 5.0 têm um modelo de programação processual, que é essencialmente um ESQL alternativo, no qual você descreve todas as etapas requeridas para executar uma transformação. A Versão 6.0 utiliza um modelo de programação declarativo, no qual você descreve o resultado da transformação e as ferramentas determinam como obter esse resultado.
A maioria das falhas de migração resultam de mapas de mensagens que contêm uma grande quantidade de informações sobre as etapas que desempenham a transformação e não possuem informações suficientes sobre o resultado desejado. Para esses mapas de mensagens, a migração é ativada alterando-se o arquivo .mfmap de forma que seções "how to" sejam separadas em uma função ou procedimento ESQL que pode ser chamado pelo mapa de mensagens. O arquivo .mfmap chama o ESQL em vez de contê-lo como uma expressão. O comando mqsimigratemfmaps migra o arquivo .mfmap, mas chama o ESQL em vez de registrar um erro de migração.
Uma limitação é que ESQL (o tempo de execução para os arquivos .mfmap e .msgmap) não pode definir funções que retornam valores do elemento complexo (ou REFERENCE). O procedimento a seguir explica como resolver esta limitação de destino do elemento complexo; em muitos casos, isto significa que o mapa deve ser regravado como ESQL. Para obter informações e exemplos adicionais sobre como chamar ESQL a partir de mapas, consulte a amostra de mapeamento WebSphere Message Brokers em .
src_msg.e[1] + src_msg.e[2]calcule o resultado de uma função ESQL como:
CREATE FUNCTION addOneAndTwo(IN src_msg) BEGIN RETURN src_msg.e[1] + src_msg.e[2]; END;No arquivo .msgmap, chame a função ESQL addOneAndTwo utilizando o elemento pai src_msg como um parâmetro.
src_msg.*ou
src_msg.*[]pode ser processada utilizando uma função que utiliza o pai do campo de repetição:
CREATE FUNCTION processAny(IN src_msg) BEGIN DECLARE nodeRef REFERENCE TO src_msg.e.*; DECLARE result <dataType> <initialValue>; WHILE LASTMOVE nodeRef DO -- colocar expressão aqui SET result = result; END WHILE; RETURN RESULT; END;No arquivo .msgmap, chame a função ESQL utilizando o elemento pai src_msg como um parâmetro.
src_msg.{'a' || 'b'}podem ser processadas por funções ESQL que processam o pai do campo de repetição:
CREATE FUNCTION processDynamicName(IN src_msg) BEGIN RETURN src_msg.{'a' || 'b'}; END;No arquivo .msgmap, chame a função ESQL utilizando o elemento pai src_msg como um parâmetro.
SELECT MAX("#T".FIRSTNAME) FROM Database.CUSTOMER AS "#T" WHERE "#T".CUSTOMERID = custIdpodem ser processadas por funções ESQL que processam o pai do campo de repetição:
CREATE FUNCTION processMAX(IN custId) BEGIN RETURN SELECT MAX("#T".FIRSTNAME) FROM Database.CUSTOMER AS "#T" WHERE "#T".CUSTOMERID = custId END;No arquivo .msgmap, chame a função ESQL utilizando o elemento custId como um parâmetro.
e || "#I"devem ser totalmente regravados em ESQL. Por definição, deve haver um elemento pai de repetição complexo e isto não é suportado por funções ESQL.
src_msg.e[src_msg.a]devem ser regravadas utilizando linhas if, funções msgmap:occurrence() e funções ESQL:
for src_msg.e if condition msgmap:occurrence(src_msg/e) = src_msg/a
src_msg.e["#I" +5] src_msg.e[< 3]todo o arquivo .mfmap deve ser regravado em ESQL, pois os arquivos .msgmap ainda não suportam acesso indexado para campos de repetição.
src_msg.e IN (1, 2, 3)devem ser regravados em ESQL, pois os arquivos .msgmap não suportam expressões ROW ESQL.