Пользовательский адаптер BizTalk

Я не уверен, что задаю правильный вопрос, но это сценарий, который я пытаюсь запустить:

Несколько файлов (XML и несколько связанных файлов, "вложений") должны попасть в BizTalk как одно сообщение. Я посмотрел на существующие адаптеры, и не вижу, что сделано с существующими один раз. Чтобы быть более точным, файлы взяты из файловой системы. Файлы не могут быть найдены одновременно, но приходят по одному, когда заказ не обеспечен. Файл XML (содержимого) - это файл, который знает, какие вложения он должен иметь (какие другие файлы).

Мы смотрим на BizTalk 2009, и мне было интересно, будет ли ответственность за пользовательский адаптер или что-то еще. И где бы я мог искать образцы.

Благодарю.

3 ответа

Решение

Вероятно, можно сделать то, что вы хотите, используя специальный адаптер, хотя я бы рекомендовал против этого. Вы можете достичь того, что вам нужно, используя оркестровку.

То, что вы ищете, это как конвой или, по крайней мере, некоторое использование корреляции.

В BizTalk конвой - это шаблон обмена сообщениями (в отличие от функции BizTalk), который позволяет обрабатывать группы сообщений с помощью одной оркестровки.

По сути, вы используете корреляцию на принимающем порте для группировки сообщений в параллельном (что вы, вероятно, хотите) или последовательном режиме.

Есть статья [здесь] ( http://msdn.microsoft.com/en-us/library/ms942189(BTS.10).aspx) Стивена Томаса о конвоях (это для BT 2004, но концепции все еще держать), и есть много дополнительной информации в Интернете и в книгах (Professional BizTalk server 2006 имеет подраздел на них)

Без более подробной информации о вашем сценарии трудно точно знать, как будет построен конвой, но ниже приведены два подхода (кроме того, у меня не было возможности правильно использовать BT2009, поэтому может быть расширенная поддержка сценариев корреляции, которые выручить)

Гибкая корреляция

Если вы ничего не знаете о файлах, перечисленных в контекстном XML, вам, вероятно, понадобится шаблон, подобный описанному Чарльзом Янгом в этом посте.

Неравномерный последовательный конвой

Если у вас есть немного информации перед раздачей, один из способов может быть следующим (в основном, неоднородный последовательный конвой):

Это предполагает, что есть какой-то способ связать все файлы вместе, чтобы вы могли соотнести их.

Создайте единую оркестровку, которая подписывается на ваш входящий порт приема (который содержит местоположение приема файла).

Эта оркестровка будет иметь одну форму получения активации, настроенную для вашего файла содержимого.

Как только оркестровка начинается с файла содержимого, вторая коррелированная форма приема начинает собирать сообщения, соответствующие этому файлу содержимого. (это второе получение может быть в цикле, чтобы учесть переменное количество файлов)

Затем вы упаковываете их все вместе в один исходящий файл вашего дизайна и отправляете их после получения полного количества файлов.

Ответ Дэвида - правильный ответ.

Даже в тех случаях, когда вы абсолютно ничего не знаете о содержимом ожидаемых вложений, вы наверняка знаете их имена и местонахождение. Поэтому вы можете использовать гибкую корреляцию, связанную с ответом Дэвида следующим образом:

Ключом к решению является сопоставление встроенного свойства BTS.ReceivedFileName.

Сначала создайте пользовательский конвейер приема с настраиваемым компонентом конвейера, который продвигает свойство контекста BTS.ReceivedFileName полученных сообщений. Этот простой пользовательский компонент довольно легко написать, но вы можете сделать его простым, используя сторонние фреймворки, такие как (бесстыдный плагин, здесь) мой класс PipelineComponentBase или превосходный мастер BizTalk Server Pipeline Component Wizard.

Теперь для легкой части:

  • Вложения принимаются в определенном месте, обозначенном его путем в файловой системе.
  • Создайте место получения, которое прослушивает альтернативное местоположение, используемое только для контроля, когда файлы фактически проглатываются BizTalk.
  • В вашей оркестровке создайте тип корреляции с помощью свойства BTS.ReceivedFileName и набора корреляций на основе этого типа корреляции.
  • Если вы хотите получать двоичные вложения, отправьте фиктивное сообщение со свойством контекста BTS.ReceivedFileName, для которого задано имя двоичного вложения, но с путем, соответствующим альтернативному расположению; тот, который используется местом получения. Инициализируйте корреляцию на форме отправки.
  • Используйте форму выражения, чтобы скопировать двоичный файл из его исходного местоположения в тот, который используется местоположением получения.
  • Наконец, используйте форму приема, привязанную к порту приема, который содержит местоположение приема, чей пользовательский конвейер приема будет продвигать свойство BTS.ReceivedFileName.

Обратите внимание, что вам действительно нужно отправить сообщение для инициализации корреляции. Неважно, какое сообщение вы отправляете на самом деле. Что бы я сделал, это отправил сообщение через конвейер отправки, который содержит пустой компонент конвейера. Это компонент конвейера, который читает сообщение, но возвращает ноль (так что сообщение исчезает, прежде чем оно достигнет адаптера). Более сложным решением будет использование нулевого адаптера. Это адаптер, который читает сообщение, но ничего с ним не делает.

Эти два решения позволяют избежать накопления большого количества файлов во временном месте, просто для инициализации корреляции!

Мне кажется, лучший подход - реализовать вышеуказанные требования с помощью комбинации пользовательского компонента конвейера и / или пользовательского адаптера. Я предполагаю, что вам на самом деле не нужно манипулировать входящими файлами - за исключением файла содержимого XML - или вы не могли этого сделать, поскольку они представлены в двоичном формате. Это требует пользовательского компонента конвейера.

Что вы можете сделать, так это разработать собственный адаптер BizTalk для взаимодействия с файловой системой и реализовать логику прослушивания и зацикливания. Затем вы можете разработать собственный конвейерный компонент для создания одного сообщения BizTalk, возможно, с типом данных base64 для двоичных данных. Кроме того, вы также можете рекламировать сообщения прямо в этом компоненте, чтобы включить оркестровку подписок.

Оркестровки больше подходят для реализации бизнес-сценариев рабочих процессов, когда сообщения уже представлены в формате XML. Это не похоже на случай. В любом случае, я думаю, что, по крайней мере, потребуется специальный компонент конвейера.

Другие вопросы по тегам