Pergunta

Eu não tenho certeza se eu fazer a pergunta certa, mas este é o cenário que eu estou tentando executar:

Vários arquivos XML (e alguns arquivos relacionados, "Anexos") tem que entrar em BizTalk como uma única mensagem. Eu olhei em adaptadores existentes, e não vê que feito com existente uma vez. Para ser mais exato, os arquivos são tomadas a partir do sistema de arquivos. Os arquivos não são encontrados, ao mesmo tempo, mas chega um de cada vez, quando a ordem não está garantida. arquivo XML (conteúdo) é o único que sabe o que anexos tem que ter (o que outros arquivos).

Nós estamos olhando para BizTalk 2009 e eu estava me perguntando seria que a responsabilidade de um adaptador personalizado, ou qualquer outra coisa. E foram eu poderia olhar para as amostras.

Graças.

Foi útil?

Solução

É provavelmente possível fazer o que quiser usando um adaptador personalizado, embora eu recomendo contra ela. Você pode conseguir o que você exigir o uso de orquestração.

O que você está procurando é likey um comboio, ou pelo menos algum uso de correlação.

Em BizTalk um comboio é um padrão de mensagens (em oposição uma característica BizTalk) que permite que grupos de mensagens para ser processado por um único orquestração.

Você essencialmente utilizar a correlação em uma porta de recepção de mensagens de grupo juntos em qualquer um paralelo (o que você provavelmente vai querer) ou modo sequencial.

Há um artigo [aqui] ( http : //msdn.microsoft.com/en-us/library/ms942189 (BTS.10) .aspx) por Stephen W. Thomas sobre comboios (é para BT 2004, mas os conceitos ainda têm) e há uma grande quantidade de informação adicional sobre a web e em livros (Professional servidor BizTalk 2006 tem uma subseção sobre eles)

Sem mais detalhes sobre sua situação, é difícil saber exatamente como o comboio seria construído, mas abaixo são duas abordagens para olhar (também, eu não tive a chance de usar corretamente BT2009 portanto, pode haver suporte estendido para cenários de correlação que ajuda-lo).

Correlação flexível

Se você não sabe nada sobre os arquivos listados no XML contexto você provavelmente vai precisar de um padrão como a descrita por Charles Young em este post .

comboio seqüencial não-uniforme

Se você tem um pouco de informação antes da mão de uma maneira pode ser a seguinte (basicamente um comboio seqüencial não-uniforme):

Isso faz com que a suposição de que há alguma maneira de ligar todos os arquivos juntos para que você possa correlacioná-los.

Criar um único orquestração que subscreve você entrada porta de recepção (que contém o arquivo receber local).

Este orquestração terá uma única ativação recebem forma que está configurada para o seu arquivo de conteúdo.

Uma vez que a orquestração é iniciado por um arquivo de conteúdo uma segunda correlacionada receber de forma começa a pegar as mensagens que correspondem a esse arquivo de conteúdo. (Esta segunda receber poderia possível estar em um loop para permitir número variável de arquivos)

Você, em seguida, embalá-los todos juntos em um único arquivo de saída de seu projeto e enviá-los uma vez que o número total de arquivos tenha sido recebido.

Outras dicas

Parece-me uma melhor abordagem seria implementar os requisitos acima com uma combinação de um componente de pipeline personalizado e / ou um adaptador personalizado. Eu suponho que você realmente não precisa de manipular os arquivos de entrada - exceto para o arquivo XML de conteúdo - ou que você não podia, uma vez que estão em formato binário. Isto exige uma componente de pipeline personalizado.

O que você pode fazer é desenvolver um adaptador BizTalk personalizado para interagir com o sistema de arquivos e para implementar a escuta e looping lógica. Em seguida, você pode desenvolver um componente de pipeline personalizado para criar uma única mensagem BizTalk talvez com tipo de dados base64 nele para dados binários. Além disso, você também pode promover mensagens direita neste componente para permitir assinaturas de orquestração.

As orquestrações são mais adequados para a implementação de cenários de fluxo de trabalho de negócios onde as mensagens já estão no formato XML. Este não parece ser o caso. Em todo caso, acho que pelo menos um componente de tubagem personalizado seria necessário.

A resposta de David é a resposta correta.

Mesmo nos casos em que você não conhece absolutamente nada sobre o conteúdo dos anexos esperados, certamente você sabe seus nomes e locais. Portanto, você pode usar o Correlação flexível vinculado na resposta de david assim:

A chave para a solução é correlato na builtin propriedade BTS.ReceivedFileName.

Em primeiro lugar, criar um personalizado pipeline de recebimento, com um componente de pipeline personalizado que promove a propriedade de contexto BTS.ReceivedFileName das mensagens recebidas. Este componente personalizado simples é bastante fácil de escrever, mas você pode torná-lo simples usando estruturas de terceiros, tais como, ( plug descarado, aqui ) minha classe PipelineComponentBase ou o excelente Assistente de componentes do BizTalk Server Pipeline .

Agora, para a parte mais fácil:

  • Os anexos são recebidos em um local específico, designado pelo seu caminho no sistema de arquivos.
  • Criar um local de recebimento que escutas a um local alternativo , usado apenas para controle quando os arquivos são realmente engolido por BizTalk.
  • Na sua orquestração, criar um tipo de correlação com a propriedade BTS.ReceivedFileName e uma base conjunto de correlação sobre este tipo de correlação.
  • Quando você quiser receber anexos binários, enviar uma mensagem fictício com o BTS.ReceivedFileName conjunto de propriedades de contexto para o nome do arquivo do anexo binário, mas com o caminho correspondente ao local alternativo ; o utilizado pelo local de recebimento. Inicializar a correlação na forma de envio.
  • Use uma forma de expressão para copiar o arquivo binário do seu local original ao usado pelo local de recebimento.
  • Finalmente, use a receber forma ligada à porta de recepção que contém o local cujo costume receber gasoduto promoverá a propriedade BTS.ReceivedFileName receber.

Observe que você realmente precisa para enviar uma mensagem para inicializar a correlação. Não importa qual a mensagem que você envia realmente. O que eu faria é enviar a mensagem através de um pipeline de envio que contém um componente vazio pipeline. Que é um componente de pipeline que lê a mensagem, mas return null (para que a mensagem desaparece no ar antes de atingir o adaptador). Uma solução mais elaborada seria usar um nulo adaptador. Isso é um adaptador que lê a mensagem, mas não fazer nada sobre isso.

Estas duas soluções evitar ter muitos arquivos acumular em um algum lugar localização temporária, apenas por uma questão de inicializar uma correlação!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top