sexta-feira, 8 de janeiro de 2010

Criando Pipeline Receiver Decoder Customizado

Escrevi esse artigo e enviei para a revista americana Biztalk Hotrod, que tem como editor o Rajinder Singh, da Microsoft.
Ele aceitou e publicou nessa edição de dezembro.
Segue link
http://biztalkhotrod.com/Documents/Issue8_Q4_2009.pdf pag 63.

Esta em inglês, mas como o objetivo do blog é compartilhar informações sobre Biztalk em português, prometo publicar o artigo na nossa lingua.

Passem lá!

Trabalhando com Fault Message

E ai pessoal, tudo bom?

Hoje vou falar sobre como trabalhar com a Fault Message  em uma porta do tipo Request-Response.

Quando usamos um WebService com esse tipo de porta, e acontece um erro, o que acaba sendo retornado para o WebService é uma mensagem de Time out.

Aparece uma Mensagem +/- parecida com essa:

image 

O ideal seria que a mensagem fosse retornada com a descrição do erro.

Usando a Fault Message teremos a seguinte mensagem:

image

Então mãos a obra:

 Criando a Fault Port

  1. Crie um novo projeto de Biztalk.
  2. Adicione uma orchestration.
  3. Adicione um schema com o nome de schEntrada. Deve ter a seguinte estrutura:

    image

  4. Adicione outro schema com o nome de schErro. Deve conter o seguinte layout:

     image

  5. Adicione um shape de “Receive”.
  6. 6.    Na orchestration adicione um “Scope”, dentro dele deve conter um shape de “Send”, e um shape de “Message Assignment”, que construirá a mensagem a ser enviada.
  7. 7.       Crie uma porta Lógica do tipo Request-Response, com o Operation público, para podermos publicar a orchestration como WebService.

     image

    Segue script do Message Assignment.

    image 

    É importante tentar salvar o XML em um local que não existe para forçar o erro

  8. Clique em Operation com o botão direito da porta criada e clique em “New Fault Message”.

           image

  9. Crie uma mensagem do tipo schErro.
  10. 10. Arraste um shape de “Send” no exception do Escopo, e um “Message Assignment” para construir a Mensagem de erro e enviar para a porta Fault.

      image

Segue o Script do “Message Assignment”

image 

Está feito! Assim quando ocorrer um erro na orchestration, a descrição detalhada será retornada no lugar da porta Response do WebService.

Agora é só fazer o deploy do projeto e publicar a orchestration como Web Service.

O código do exemplo pode ser baixado em: http://faultmessage.codeplex.com/

Nesse exemplo, existem duas orchestration, uma com Fault Message e outra sem. Também existe o Web Service pronto, assim como o Pacote Msi e os Bindings.

Enjoy!

quarta-feira, 30 de dezembro de 2009

Selecionando dados utilizando o WCF-Sql Server Adapter

Uma das novidades do Biztalk Server 2009 está relacionado com a utilização do adaptador WCF para realizar acesso ao banco de dados SQL Server.
Nesse novo adaptador não é necessário criar instruções SQL utilizando a terminação FOR XML como nas versões anteriores do adaptador.

Para utilizar o WCF é necessário instalar alguns complementos do Biztalk Server:

• WCF LOB Adapter SDK SP2 Download
• Microsoft BizTalk Adapter Pack 2.0 Download

Neste artigo será mostrado como gerar um arquivo XML com os dados de uma tabela do SQL Server 2005 utilizando o WCF.

Banco de dados

1) No SQL Server 2005 crie uma tabela Vendedor em um Banco de dados denominado Vendas.



2) As colunas dessas tabelas são:



3) Preencha alguns dados na tabela do banco de dados.



Projeto Biztalk

1) Crie uma nova solução no Visual Studio 2008 nomeado WCFSQLAdapter

2) Clique com o botão direito sobre o nome do projeto no Solution Explorer e selecione Add -> Add Generated Items para acessar o menu com os templates relacionados ao projeto Biztalk



3) Selecione o template ConsumeAdapterService que é um wizard que permite configurar diferentes tipos de WCF.





4) Selecione o tipo de Binding relacionado ao SQL Server: sqlBinding



5) Clique no botão Configure para configurar as propriedades relacionados a conexão SQL Server

6) Na guia URI Properties configure as propriedades:

Server: Nome do Servidor SQL Server
Initial Catalog: Nome do Banco de dados do SQL Server



7) Clique no botão Connect para estabelecer a conexão com o banco de dados.

8) No menu à esquerda expanda a árvore e selecione a tabela Vendedor.

9) Selecione a operação Select e clique no botão Add.



10) Clique em Ok para confirmar a criação dos schemas que serão adicionados ao projeto. O wizard criará três arquivos:

Table.dbo.xsd: Schema referente a tabela Vendedor
TableOperation.dbo.Vendedor.xsd: Schema referente a operação Select utilizado pelo adaptador WCF
WcfSendPort_SqlAdapterBinding_Custom.bindinginfo.xml: Binding referente as configurações da porta WCF que será utilizado pelo Biztalk



11) Adicione um novo schema denominado Vendedor.xsd ao projeto Biztalk, que será utilizado como critério de pesquisa para trazer os dados do SQL Server.



12) Adicione um novo mapa denominado SchemaVendedorParaTabelaVendedor.btm ao projeto Biztalk, que será utilizado para mapear o schema de pesquisa para a cláusula Select que será utilizado para pesquisar os dados no banco de dados SQL Server.

13) Nesse mapeamento será incluído dois String Concatenate Functoids.



14) O valor do Functoid conectado ao elemento Columns é *.



15) O valor do outro functoid conectado entre os elementos Id e query possui a cláusula de pesquisa SQL Server “Where IdVendedor =”.



16) Adicione uma nova Orchestration denominado orchSelecionaVendedorPorId.odx. Essa orchestration receberá um arquivo XML com o ID a ser pesquisado e enviará para o SQL Server. O Biztalk receberá o resultado da pesquisa realizado no SQL Server e criará um arquivo XML contendo esse resultado.

As mensagens utilizadas na orchestration são:




  • msgVendedorSchema: WCFSQLAdapter.Vendedor

  • msgVendedorSelect: WCFSQLAdapter.TableOperation_dbo_Vendedor.Select

  • msgVendedorSelectResponse:
    WCFSQLAdapter.TableOperation_dbo_Vendedor.SelectResponse

As portas utilizadas na orchestration serão configuradas posteriormente no Biztalk Administration Console.




  • FileIn: One-way Receiving
  • FileOut: One-way Sending

SQLSelect: Request-Response Sending a Request and receiving a response



17) Configure uma chave WCFSQLAdapter.snk nas propriedades do projeto Biztalk.



18) Compile o projeto.

Configurando a porta WCF no Biztalk Administration Console

1) Crie uma nova aplicação denominado WCFSqlAdapter no Biztalk Administration Console
2) Adicione as bibliotecas WCFSqlAdapter.dll no Resources da aplicação.



3) Importe o binding através do arquivo WcfSendPort_SqlAdapterBinding_Custom.bindinginfo.xml que pode ser feito



4) Selecione a Send Port WcfSendPort_SqlAdapterBinding_TableOp_dbo_Vendedor_Custom com o botão direito e selecione Properties para configurar as suas propriedades.

5) Clique no botão Configure.



6) Configure as propriedades Action que contém o nome da operação utilizada na orchestration. Esse nome corresponde ao nome da porta lógica utilizada na orchestration.







7) Na guia Binding configure o nome do login e a senha utilizada para acessar o banco de dados SQL Server.



8) Clique em Ok para confirmar as configurações da porta WCF.

Configurando a porta Send File

1) No Biztalk Administration Console crie uma nova porta Send.

Propriedade Valor
Name FileOut
Type File
Send Pipeline XML Transmit



2) Clique no botão Configure. Na propriedade Destination Folder selecione o diretório físico onde serão exportados os arquivos XML com os resultados do SQL Server



Configurando a porta Receive File

1) No Biztalk Administration Console crie uma nova porta Receive.

2) Crie uma nova receive Location associado a essa porta Receive.



  • Name: ReceiveLocation1

  • Type: File

  • Receive Pipeline: XMLReceive





3) Clique no botão Configure. Na propriedade Receive Folder selecione o diretório físico onde serão importados os arquivos XML com os critérios de pesquisa.



Configurando a orchestration

1) No Biztalk Administration Console configure a orchestration com as portas send e receive.



  • Inbound Port: FileIn
  • Outbound Ports: SQLSelect -> WcfSendPort_SqlAdapterBinding_TableOp_dbo_Vendedor_Custom
  • Outbound Port:FileOut -> FileOut





Executando o aplicativo

1) Crie um arquivo Teste.xml e coloque no diretório físico relacionado ao receive location.



2) Após a execução, será gerado um arquivo XML no diretório físico relacionado ao send port



Conclusão

O adaptador WCF SQL Adapter não utiliza nenhuma cláusula SQL terminando por “FOR XML” para selecionar os dados como nas versões anteriores. As informações relacionadas as colunas da tabela são selecionadas diretamente no elemento columns do schema WCF. Podem ser seleciondas todas as colunas como demonstrada nesse exemplo através do String concatenate functoid com valor * ou definr quais são as colunas desejadas separando-as por vírgulas.
Os critérios de pesquisa são especificados diretamente no elemento Query do schema do WCF através da utilização de um String Concatenate Functoid.
O WCF SQL Adapter possui uma configuração mais detalhada do que a utilizada pelos adaptadores SQL das versões anteriores. Isso exige uma maior atenção ao configurá-lo para que funcione corretamente.

O código do exemplo pode ser baixado em: http://samplewcfsqlserver.codeplex.com/

quinta-feira, 10 de dezembro de 2009

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:

image

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 DeliveryFailureNotification, 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:

image

Adicionando o Exception

Adicione um "Scope" e arraste o send shape para o seu interior. Adicione um "Exception Handler" do tipo DeliveryFailureNotification. Veja exemplo abaixo.

image

No Exception, adicione um shape de Expression e coloque:

image

Compile a Aplicação e coloque os respectivos Bindings.

Para a Send Port, configure uma pasta inexistente.

No Event Viewer deve aparecer o erro:

image

"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..

Utilizando usuário anonimo Send Port FTP Adapter

Para utilizar usuário anonimo em uma Send Port do tipo FTP Adapter, basta setar o "User Name" como "Anonymous", sem senha..

image

Espero que possa ser útil..

Até mais! :)

domingo, 15 de novembro de 2009

Resolvendo Erro de SOAP Adapter em Receive Port

Considere o seguinte erro no Event Viewer:

“The Messaging Engine could not find the receive location for URI:"/endereco_do_seu_web_service.asmx".\

Please verify the receive location exists and is enabled.”

Primeiro é sempre bom verificar se realmente a Receive Location desse Web Service existe e se está ativa, depois restartar todos os Hosts.

Se mesmo depois de ter feito isso, a mensagem de erro ainda persistir, então verifique se existe mais de um Host Instance associado para o SOAP Adapter de receive.

Como na figura abaixo, o recomendado é ter apenas um Host Instance configurado, no caso, o BiztalkServerIsolatedHost.

clip_image002

Espero que possa ajudar alguém no futuro.

Chamar dinamicamente uma orchestration com shape “Call Orchestration” - Parte 2

Há algum tempo atrás apresentei aqui, no blog, uma solução para evitarmos a dependência entre orchestration ao utilizar o shape “Call Orchestration”.

O artigo pode ser lido em: http://biztalkbrasil.blogspot.com/2009/10/chamar-dinamicamente-uma-orchestration.html.

Pois bem. Qual não foi minha surpresa ao utilizar o código disponibilizado pelo Jon Facey, e me deparar com um erro, toda vez que a orchestration chamada, ficava com o status dehydrate.

Segue o erro:

DehydrationFailedException Type 'System.Xml.XmlDocument' in Assembly 'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.

Então percebi que se na orchestration chamada houvesse uma porta de uma única direção (request) a solução funcionava bem. Mas se houvesse uma porta de direção dupla (Request/Response), a orchestration ao mudar seu status para dehydrate o exception era acionado.

Para resolver criei outra solução, baseado na idéia do Jon mas com diferenças significativas:

  1. Agora temos a parte gráfica e podemos debugar a "DLL", como se realmente fosse uma orchestration.
  2. Criei 3 parâmetros: 1 string de entrada TipoProcesso, que representa o Assembly a ser passado; MsgIn parâmetro de entrada do Tipo XMLDocument; MsgOut parametro de saida do tipo XMLDocument.
  3. Com esses novos parâmetros a orchestration que será chamada deverá obrigatoriamente conter o parâmetro de entrada do tipo XMLDocument e parâmetro de Saída do tipo XMLDocument.

Por favor, postem um comentário, caso tenham algum outro problema com a DLL.

Disponibilizei um novo release do projeto. Segue o link.

http://dynamicinvocation.codeplex.com/