2012-04-19 3 views
0

История до сих порСовокупные сообщения из <all> потока в Mule

У меня есть службы SOAP, который посылает свой ответ (говорят Response_A) к < все > потока. Внутри потока есть три службы SOAP (например, B, C и D), которые принимают входные данные от Response_A. Я принимаю поле из Response_A и используя XSLT, я могу сформулировать запросы на B, C и D.

Быстрый вопрос: Я использую <ASync> блоков внутри < все > для обработки сообщений параллельно. Обработка не была параллельной при использовании < всех > и < процессор-цепочка > теги внутри него. Любые идеи почему?

дорожная карта

Я буду читать ответы от всех трех B, C и D и объединить их в единый ответ (возможно, с использованием XSLT снова) и отправить его в Е.

The roadblock

После выхода из < все > поток, я получаю MuleMessageCollection. Как его прочитать и объединить сообщения в одно сообщение?

Мои попытки

Я попытался агрегирование сообщения на основе корреляции ID, но я заметил, что корреляция идентификатор присутствует только тогда, когда сообщение от A был разделен на < все > теге и направляется B, C и D. Идентификатор корреляции исчезает в конверте SOAP, который приходит как ответ от этих сервисов, даже если я повернул enableMuleSoapHeaders в true. Я не могу изменять службы. Итак, как мне сделать идентификатор корреляции в ответе SOAP (при условии, что идентификатор корреляции абсолютно необходим, если я хочу объединить сообщения)

Мне также понадобится размер группы для агрегирования сообщений.

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

Таким образом, это сводится к одному вопросу. Каковы способы объединения сообщений из MessageCollection?

Я хочу сделать это в xml, не записывая собственный трансформатор в Java. Является ли это возможным? Какой должен быть мой подход?

Примечание: Ответные сообщения от B, C и D имеют разные структуры DOM. Объединенное сообщение, которое я хочу создать, имеет разные DO из всех ответов и запросов A, B, C и D.

Если это помогает, я пытаюсь работать в аналогичной ситуации, как описано здесь: http://ricston.com/blog/?p=640 Единственная разница в том, что я использую потоки и тег all.

ответ

0

Обработка не была параллельной при использовании и тегов внутри нее.Любые идеи почему?

Это потому, что все и процессор цепи синхронны по своей природе: они ничего не распараллелить.

Теперь, если у вас возникли проблемы с объединением удаленных асинхронных ответов, если удаленная служба не отражает заголовки Mule (что имеет место для подавляющего большинства услуг, не поддерживающих Mule), вам нужно выяснить, может использовать значение полезной нагрузки ответа, которое будет отражено обратно от удаленной службы (это может быть заголовок SOAP или поле, такое как идентификатор, внутри тела SOAP). Если это так, вы можете сконфигурировать сборщик с выражением-сообщением-информацией-отображением, который указывает, что корреляция не будет выполнена с использованием заголовка Mule, а другого источника.

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

+0

спасибо Давиду. Вы мой спаситель. :) Итак, есть ли у вас идеи по накоплению сообщений в коллекции сообщений? Я получаю объект CopyOnWriteArrayList, который содержит как ответы XML, которые мне нужно объединить в один. Я мог видеть это на консоли сервера tc, когда я попытался отправить его в качестве ввода на следующий сервер. Итак, как мне объединить сообщения, присутствующие в CopyOnWriteArrayList, и отправить их как XML для следующей службы? На этом последнем этапе мой запланированный поток будет завершен. – r3st0r3

+0

CopyOnWriteArrayList на самом деле просто java.util.List. Этот список содержит все, что было возвращено из удаленных вызовов (строки или байт [] или InputStream, проверьте его). Поэтому вам нужно создать трансформатор, который собирает эти полезные нагрузки. Кажется, вы хотите, чтобы они являлись объектами XML, поэтому необходимо собрать их под новым корнем (например, ) и передать это компоненту компонента ответа. –

+0

Я понял. Я добавил объект в XML-трансформатор после CopyOnWritArrayList и написал собственный трансформатор в Java. Я хотел сделать это с помощью XSLT, но я не очень хорошо знаю XSLT. – r3st0r3

Смежные вопросы