Tratando Exceptions da Send Port na Orchestration
Quando a Send Port é do tipo Request-Response manipular o exception é intuitivo, já que basta colocar um escopo e adicionar um exception do tipo System.Exception. Mas quando a porta é one-way a coisa complica um pouco.
Como já tive vários problemas com esse tipo de porta, sem saber se a mensagem chegou ou não ao seu destino, decidi postar esse artigo.
Configurando a Porta na Orchestration
Crie um novo projeto e adicione uma orchestration com shapes de receive e send message. Crie uma nova mensagem do tipo XMLDocument. Crie uma Receive e uma Send Port One-Way. Na propriedades da Send Port configure a opção "Delivery Notification" para "Transmitted", como mostra a figura abaixo:
Essa opção "Delivery Notification", quando está com a opção "Transmitted" flegada, indica que a orchestration deve ser notificada no caso da mensagem não ser recebida pelo destino. Quando a mensagem não puder ser entregue, será acionado o Exception DeliveryFailureException, que precisará ser tratado na Orchestration.
OBS: "Delivery Notification" somente funciona se a opção "Retry Count" na Send Port estiver configurada como 0. Essa opção não esta disponível quando o Binding da Porta for "Specify Now" e "Direct".
A seguir um exemplo de como configurar o "Retry Count" na Send Port do Console:
Adicionando o Exception
Adicione um "Scope" e arraste o send shape para o seu interior. Adicione um "Exception Handler" do tipo DeliveryFailureException. Veja exemplo abaixo.
No Exception, adicione um shape de Expression e coloque:
Compile a Aplicação e coloque os respectivos Bindings.
Para a Send Port, configure uma pasta inexistente.
No Event Viewer deve aparecer o erro:
"The FILE send adapter cannot open file C:\Pasta\{08B23A7F-67E8-465A-B058-05ED3683AE5A}.xml for writing.
Details: The system cannot find the path specified."
Fácil!
O código do exemplo pode ser baixado em: http://samplehandlingexcept.codeplex.com/
Até a próxima..
Seja o primeiro a comentar ;)
Postar um comentário