Como enviar Mensagens Ordenadas

Eu sempre tive muita curiosidade de como implementar a Order Delivery, Resequencer Pattern, a entrega ordenada de mensagens.
Resequencer Pattern nada mais é do que o Biztalk receber as mensagens e enviá-las na forma correta. Por exemplo se o Biztalk receber as mensagens na ordem: 5, 4, 2, 3, 1; deve entrega-lás na ordem correta: 1, 2, 3, 4, 5.
Lendo sobre o assunto vi que não tem uma maneira nativa do Biztalk fazer isso.
Devemos receber as mensagens que contem o número sequencial do respectivo envio e o número de Lote, guardá-las em um objeto com a ajuda do correlation, e enviar através de um Loop de forma ordenada.
A solução ficou bem interessante:

 

1 – Criar o Schema de Entrada

  • Com o botão direito em cima do projeto clique em Add –> New Item –> Schema.
  • O Schema deve ficar parecido com a foto abaixo:
image
  • Promover os campos LoteID que será o nosso correlation.

2 – Criar a classe para Guardar as Mensagens em um objeto

  • Adicione um novo projeto do tipo Class Library.
  • E adicione o seguinte código:
[Serializable] public class ResequencerPattern { [NonSerialized] private SortedDictionary<int, XmlDocument> DocOrdenado = new SortedDictionary<int, XmlDocument>(); public void AddDocOrdenado(int key, XmlDocument doc) { DocOrdenado.Add(key, doc); } public XmlDocument GetDocOrdernado(int key) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc = DocOrdenado[key]; DocOrdenado.Remove(key); return xmlDoc; } public int GetTamanhoLista() { return DocOrdenado.Count(); } }


Aqui estou usando a classe SortedDictionary que ordena sozinho a lista, conforme vai sendo adicionado os objetos. Bacana hein..

3 – Criar a Orchestration
  • Criar o correlation com o campo LoteID.
  • Adicionar um shape de receive, e um looping até que a orchestration fique parecida com a foto abaixo;
image

  • No primeiro shape de receive inicializar o correlation e no segundo receive setar a propriedade Following Correlation Sets.
  • Fazer referencia ao projeto de criado no Passo 2 e inicilizar as variaveis no shape SetaVariaveis:
image

  • Adicionar o seguinte codigo ao Expression shape chamado de Add Doc SortedDictionary:
image

  • Criar a lógica do Looping para que receba mensagens até que seja o final do arquivo, como:
image

  • Repetir o Expression shape chamado de SetaVariaveis e Add Doc SortedDictionary. Porem nesse último shape, deixar apenas o código para adicionar o xmlDocument no Dicionario.
image

  • Criar um segundo looping, para enviar as mensagens ordenadas:
image

  • Nesse looping executar o método GetTamanhoLista que retorna o tamanho da Lista do Dicionario.
image

  • Criar um contador para retornar as mensagens no dicionario.
image


Conclusão:

Para Implementar o Resequencer Pattern devemos ter alguns cuidados pois pode ser um dos principais problemas de performance no servidor.

Como vimos não existe uma forma nativa de fazer a entrega ordenada da mensagem. A solução apresentada neste artigo, armazena as mensagens na memória, com o XmlDocument, o que é muito ruim caso a mensagem seja de um tamanho considerável.

O ideal seria armazenar a mensagem em outro lugar como no banco de dados do SQL Server.

É isso. Se alguem se interessar e quiser o Projeto completo é só postar um comentário.


Até a próxima.


Referencias:
http://abdulrafaysbiztalk.wordpress.com/2009/10/20/enterpriseintegrationpattern_resequencer/
O mestre http://seroter.wordpress.com/2008/10/09/in-memory-biztalk-resequencer-pattern/
http://www.amazon.com/Pro-BizTalk-2006-George-Dunphy/dp/1590596994

Seja o primeiro a comentar ;)

Postar um comentário

BizTalk 360

Visitas

Arquivo do blog