Como enviar Mensagens Ordenadas
quinta-feira, 27 de outubro de 2011
|
|
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:
Aqui estou usando a classe SortedDictionary que ordena sozinho a lista, conforme vai sendo adicionado os objetos. Bacana hein..
3 – Criar a Orchestration
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
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:
- 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;
- 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:
- Adicionar o seguinte codigo ao Expression shape chamado de Add Doc SortedDictionary:
- Criar a lógica do Looping para que receba mensagens até que seja o final do arquivo, como:
- 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.
- Criar um segundo looping, para enviar as mensagens ordenadas:
- Nesse looping executar o método GetTamanhoLista que retorna o tamanho da Lista do Dicionario.
- Criar um contador para retornar as mensagens no dicionario.
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