Trabalhando com Biztalk, Sql Adapter e Envelope | BizTalk Brasil
Trabalhando com Biztalk, Sql Adapter e Envelope
Olá Pessoal, hoje vou falar um pouco sobre como usar o conceito de Envelope com o SQL Adapter.
O Envelope no Biztalk 2006 é usado para dividir grandes mensagens em mensagens menores. Vamos dar um exemplo prático do SQL 2005: ao fazer um simples select que retornaria várias linhas, na orchestration para consumir esses registros deveríamos inserir um loop que leria registro a registro, porém com o Envelope, ele mesmo faria essa quebra, criando várias instancias da orchestration com apenas um único registro.
Bem mais fácil, simples e elegante, não? Então mãos a obra.
Preparando o Sql Server 2005
Vamos criar um novo Banco de Dados no SQL Server, e uma tabela. Segue o Script para a tabela:
1:  CREATE TABLE [dbo].[Cliente](
3:  [Id] [int] IDENTITY(1,1) NOT NULL,
5:  [Nome] [varchar](50) NULL,
7:  [Profissao] [varchar](20) NULL,
9:  [Status] [smallint] NULL,
11:  CONSTRAINT [PK_Cliente] PRIMARY KEY CLUSTERED
15:  [Id] ASC
17:  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
23:  SET ANSI_PADDING OFF
Criaremos também uma Stored Procedure sp_ConsultaCliente:
1:  CREATE PROCEDURE [dbo].[sp_ConsultaCliente]
7:  SELECT Id, Nome, Profissao from Cliente
9:  WHERE Status = 0 for xml auto, xmldata
11:  UPDATE Cliente SET Status = 1
Crie um novo Biztalk Project chamado SampleEnvelope.
Para gerar schemas a partir do SQL Adapter
1. Clique com botão direito em cima do projeto e em "Add" -> "Add Generated Items"
2. Escolha a opção "Add Adapter Metadata" e clique em "Add".
3. Escolha "SQL" e clique em "Next";
4. Clique em Set para preencher a Conection String do Banco.
5. Clique em OK e em Next.
6. Preencha o target namespace com http://SampleEnvelope e o Document Root com "ConsultaCliente". Deixe a opção como Receive Port.
7. Clique em "Next", Selecione "Stored Procedure" e clique em "Next" novamente.
8. Selecione a Stored Procedure "sp_ConsultaCliente" e clique em "Generate".
9. Clique mais uma vez em "Next" e depois em "Finish". 10. Depois de gerado o schema, altere a Stored Procedure:
1:  ALTER PROCEDURE [dbo].[sp_ConsultaCliente]
4:  SELECT Id, Nome, Profissao from Cliente
5:  WHERE Status = 0 for xml auto
6:  UPDATE Cliente SET Status = 1
Obs: Delete a orchestration que foi criada automaticamente e renomeie o nome do schema se for conveniente.
Para criar o Envelope Schema
1. Com o botão direito, clique em "Add" -> "New Item".
2. Escolha a opção Schema Files no painel esquerdo.
3. Clique na opção Schema no painel direito.
4. Renomeie o novo schema como schEnvCliente.xsd e clique em Add.
Alterando as propriedades do Envelope schEnvCliente.xsd
1. Abra o schema schEnvCliente.
2. No Editor, painel esquerdo, selecione o nó <Schema>.
3. Mude o Target Namescpace para o mesmo Target Namespace do schema SqlService.xsd (supondo que não houve alteração no nome gerado pelo Sql Adapter), no nosso exemplo http://SampleEnvelope.
4. Set a Propriedade "Envelope" para Yes.
5. Clique com o botão direito no nó "Root" e clique em "Rename". Mude o nome para ConsultaCliente.
6. Altere a propriedade Body XPath do nó ConsultaCliente clicando no "botão [...]". Escolha o nó ConsultaCliente e clique em OK.
7. Clique com o botão direito no nó ConsultaCliente, e em "Insert Schema Node" -> "Any Element"
8. Clique com o botão direito no nó <Any> e altere a propriedade "Process Contents" para "Lax".
9. Altere a propriedade Process Contents para "Lax".
Alterar o schema SqlService.xsd para trabalhar com único registro.
1. Abra o schema SqlService.xsd.
2. Clique no nó Cliente e delete os valores nas propriedades "Max Occurs" e "Min Occurs". Isso fará com que o nó só aceite um registro por vez.
3. Arraste o nó Cliente para o nó <Schema> , colocando-o no mesmo nível que ConsultaCliente.
4. Delete o nó ConsultaCliente.
Deverá ficar parecido com a figura abaixo.
Os Schemas estão configurados, será necessário criar um Receive Pipeline, para ligar o Envelope com o schema normal.
Para criar o Receive Pipeline
1. Clique com o botão direito no Projeto, clique em "Add" -> "New Item".
2. No Painel Esquerdo, escolha Pipelines. Deixe a opção como Receive Pipeline.
3. Renomeie o pipeline para rcvSampleEnvelope.btp e clique em "Add".
4. Na janela de Toolbox, arraste um componente de "XML Disassembler" para a etapa "Disassembler"
5. Altere a propriedade "Document schemas" no botão [...] e escolha o SampleEnvelope.SqlService.
6. Altere a propriedade "Envelope Schemas" no botão [...] e escolha o schema SampleEnvelope.schEnvCliente.
O Projeto está pronto. Clique em Build e Deploy. (Não esqueça de setar as propriedades "Application Name" e "Assembly Key File").
Para Configurar a Receive Port
1. No Biztalk Administration Console Clique na Receive Port do seu Application.
2. Clique com o botão direito e em "New" -> "One-Way Receive Port".
3. Renomeie a Receive Port para "RP_SampleEnvelope".
4. Clique na aba Receive Location e no botão "New".
5. Renomeie a Receive Location para "RL_SampleEnvelope".
6. Em "Transport", escolha a opção "SQL" em "Type", e clique no botão "Configure".
7. Na propriedade Connection String clique no botão [...] e configure a conexão com o Banco de Dados.
8. Na opção SQL Command, clique no Botão [...]. Na Opção "Project" escolha "SampleEnvelope" na lista. E em "Schema" escolha "SampleEnvelope.SqlService".
9. Ele irá preencher as propriedades "Target Namespace" e "Document Root Element Name". Nessa última propriedade deverá aparecer "Cliente", altere para "ConsultaCliente" (O Root do schema schEnvCliente.xsd ). Clique em OK para Finalizar.
10. Altere o Receive Pipeline para rcvSampleEnvelope, aquele que foi criado no projeto.
11. Clique em Ok nas duas telas seguintes para concluir.
Para Configurar a Send Port
1. Clique na Send Port do seu Application.
2. Clique com o botão direito em "New" -> "Static On-Way Send Port".
3. Renomeie a Send Port para snd_SampleEnvelope.
4. Em "Transport" selecione "File" na opção "Type" e clique no botão "Configure".
5. Em "Destination Folder" escolha um diretório para criar os arquivos. Clique em OK.
6. Na Aba "Filters", no painel direito em "Property" selecione "BTS.ReceivePortName", em Operator deixe o sinal de "==", e em value coloque "RP_SampleEnvelope". Clique em Ok.
Essa opção envia para essa Send Port tudo o que entrar na Receive Port RP_SampleEnvelope.
Alimente a tabela Clientes com alguns registros e com Status 0.
Ative as portas. Cheque o diretório configurado na Send Port. Para cada registro da tabela o Biztalk deverá gerar um arquivo separado.
Se caso acorrer o erro abaixo, ao executar o código desse artigo, "There was a failure executing the receive pipeline: "Microsoft.BizTalk.DefaultPipelines.XMLReceive, Microsoft.BizTalk.DefaultPipelines, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Source: "Pipeline " Receive Port: "Receive.Internal.SQL.1Way.AllPollingService.ActivationMessages" URI: "SQL://SERVER/SchOrderPolling/ORDERRESPONSE/ORDERRESPONSE/902971" Reason: Unexpected event ("document_start") in state "processing_empty_document". O final da procedure no SQL deve ser alterado para:FOR XML AUTO, ELEMENTS Ou também pode-se tentar aplicar esse hotfix:http://support.microsoft.com/kb/927741