Um dos cenários em que o BizTalk é usado com frequência é para fazer sincronização de entidades entre diferentes sistemas. Neste tipo de aplicações, sucede existirem nesses sistemas identificadores diferentes para o mesmo “conceito”. Por exemplo, num sistema um Cliente pode ser representado pelo BI, e noutro pelo Número de Contribuinte. Outro exemplo de situação é a utilização de valores do tipo “enumerado” com bases diferentes: por exemplo, num determinado sistema o sexo masculino é 0 e feminino 1, e noutro M e F. Outros exemplos semelhantes são listas de países, estados civis, etc. Um terceiro cenário, frequente não apenas em BizTalk, consiste na realização de mapeamentos, ou traduções, entre códigos de erro e mensagens legíveis por um operador humano.
Existem várias formas de resolver esta questão ao nível do BizTalk, que tipicamente passam por fazer um mapeamento entre os diferentes domínios de entidades ou informação. Estes mapeamentos podem ser estáticos ou dinâmicos. No primeiro caso, a opção é fazer algum tipo de IF/Switch, seja em código seja num BizTalk Map. No segundo caso há várias opções, todas elas tendo por base algum repositório dinâmico, por exemplo: a BD do Single Sign-On (o que garante segurança), o motor de regras do BizTalk (aqui com a vantagem de já termos um interface gráfico tipo “Backoffice”, e com versionamento incorporado), ou pura e simplesmente uma Base da Dados específica, a que acedemos com uma API própria, ou usando um Database Functoid, caso estejamos a fazer a transformação num BizTalk Map.
O BizTalk inclui uma “pequena pérola” pouco conhecida, mas que permite resolver precisamente esta classe de problemas, chamada Cross Referencing.
Usando Cross Referencing, podemos armazenar mapeamentos como os referidos em tabelas criadas especificamente para o efeito na BizTalkMgmtDb (a BD de configurações do BizTalk), usando uma ferramenta de comando de linha chamada Cross Reference Import tool (btsxrefimport.exe). Esta ferramenta lê um conjunto de mapeamentos pré-definidos num conjunto de 9 ficheiros XML, inserindo-os na BizTalkMgmtDb, em tabelas com prefixo “xref_”.
Para lhes aceder, há depois duas formas: ou por utilização dos métodos da classe Microsoft.BizTalk.CrossReferencing.CrossReferencing ou usando alguns dos functoids da categoria Database, como o Get Common Value, Get Common ID, Get Application Value, Get Application ID ou Format Message.
Não vou descrever em detalhe cada um destes, mas queria dedicar algum tempo a explicar os vários ficheiros XML necessários ao aprovisionamento das tabelas no BizTalk, uma vez que os seus significados – tal como documentados – não são intituitivos à primeira vista.
O btsxrefimport.exe recebe como parâmetro o nome de um único ficheiro XML. Este ficheiro de “Setup” contém apenas o nome de 8 outros ficheiros, que descrevo de seguida.
Definição de aplicações e instâncias
– listOfAppType: Xml com uma enumeração das aplicações que intervêm nos mapeamentos. Valor típicos seriam, por exemplo: SAP, MSCRM, SIEBEL, etc. Costumo chamar este ficheiro de “ApplicationTypes.xml“.
– listOfAppInstance: Para cada uma das aplicações do ficheiro anterior, podem definir-se várias instâncias, por exemplo para considerar ambientes de desenvolvimento/qualidade/produção. Caso este conceito não seja aplicável, podem simplesmente declarar-se instâncias com o mesmo nome da aplicação. Costumo chamar este ficheiro de “ApplicationInstances.xml“.
Definição de mapeamentos entre identificadores entidades (ID’s)
– listOfIDXRef: ficheiro que define os objectos que se vão cruzar, como sejam: Cliente, Conta, Utilizador, etc. Costumo chamar este ficheiro de “Entities.xml“.
– listOfIDXRefData: ficheiro com os mapeamentos de identificadores nas várias instâncias de aplicações, e um valor comum, interno. Assim, por exemplo, podemos indicar que no SAP de Qualidade, o cliente com ID 100 vai mapear para um ID interno de 12345, e que no Oracle é o cliente com ID 98765 que mapeia para esse ID interno 12345.
Este “ID Interno”, ou “Common ID”, é boa prática que seja o valor num dos sistemas designado como “dono” da entidade, por forma a que o BizTalk não tenha de gerir esse conjunto de identificadores. Costumo chamar este ficheiro de “EntityMappings.xml“.
Definição de mapeamentos entre valores de enumerados
– listOfValueXRef: ficheiro que define os nomes de valores “enumerados” que estão a ser mapeados. Exemplos são País, Sexo, etc. Costumo chamar este ficheiro de “Domains.xml“.
– listOfValueXRefData: ficheiro que define mapeamentos, para cada instância de aplicação, entre um valor enumerado e um “valor interno”. Costumo chamar este ficheiro de “DomainMappings.xml“.
Estes dois últimos ficheiros (enumerados) e os dois anteriores (identificadores de entidades) são, como de pode perceber, muito semelhantes. O critério de selecção é o seguinte: os primeiros devem ser usados em situações em que exista dinamismo nas entidades manipuladas, e os segundos quando os elementos sejam fixos, como nos enumerados. Por exemplo, o primeiro para Contas Bancárias ou Utilizadores, o segundo para Sexo ou Estado Civil. Um dos factos a considerar é que é possível adicionar novos mapeamentos dinamicamente no primeiro caso, o que não sucede no segundo.
Isto pode ser feito usando o Functoid “Set Common ID” (que cria um mapeamento entre dois valores, para uma instância de uma aplicação), ou o método SetCommonId da classe CrossReferencing. De notar que este método cria um “common id“, se este não for especificado como input.
Definição de mapeamentos simples de tradução de texto, para uma língua
– listOfMessageDef: ficheiro que define códigos de mensagem textual, com uma descrição e eventual referência a uma entidade. Podemos usar este ficheiro para conter uma lista dos códigos de erro dos nossos desenvolvimentos, ex: INVALID_CODE, INVALID_DATE_OF_BIRTH, NAME_TOO_SHORT, etc. Costumo chamar este ficheiro de “MessageCodes.xml“.
– listOfMessageText: Por analogia com o mapeamento de valores de enumerados, este ficheiro contém o mapeamento dos códigos anteriores para mensagens numa determinada língua (pt-pt, en-gb, etc.). Costumo chamar este ficheiro de “MessageTranslations.xml” (por vezes com a língua como sufixo).
O acesso às traduções acima pode ser feito usando o functoid “Format Message”, ou o método CrossReferencing.FormatMessage() .
A concluir
Uma rápida consulta às tabelas criadas na BizTalkMgmtDb permite compreender rapidamente como funcionam, mas coloca-se imediatamente a questão: existe alguma ferramenta para fazer a sua gestão? A resposta, infelizmente, é não. Não seria complexa de desenvolver, pelo contrário, mas não existe. Um exemplo disponibilizado pelo Scott Woodgate inclui um simples script SQL para limpar as tabelas que pode ser útil, mas também se pode recorrer a um DTS, por exemplo
Além dos links que fui incluindo, estes dois posts podem ser interessanes: Ben Cops e BizTalkLATAM (em espanhol).
Obrigado ao meu colega Tiago Oliveira por apontar esta potencialidade do BizTalk Server! 🙂
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/joaomartins]