Как маршрутизировать сообщение на основе содержимого с помощью Spring Integration 2.0.5? - PullRequest
0 голосов
/ 04 августа 2011

Я начал использовать si-xml: xpath-router, но наткнулся на контрольно-пропускной пункт. Я использую правильный маршрутизатор, но неправильную реализацию? Если я использую неправильный маршрутизатор, какой из них я должен использовать, то есть маршрутизатор по умолчанию, тип полезной нагрузки или, может быть, простое выражение SpEL?

Вариант использования:

Мне нужно направить сообщение на основе содержимого полезной нагрузки. Запрос содержит элемент, и «действие», которое мне нужно выполнить, содержится в одном, если его атрибуты см. Ниже в атрибуте «команда» .

Пример входящего запроса (поступает от веб-службы).

<Request>
  <Records>
    <Record>
      <data key="name" value="Jack Bauer" />
      <data key="command" value="sendSMS" />
    </Record>
  </Records>
</Request>

псевдокод был:

  • маршалловское сообщение.
  • маршрут, основанный на значении, через xpath-router

но я получаю ошибку:

неподдерживаемый тип полезной нагрузки [javax.xml.transform.dom.DOMResult]


Чтобы решить эту проблему, я попытался:

  • добавление атрибута «результирующий преобразователь» к бину-преобразователю с помощью ResultToDocumentTransformer. ошибка = не удалось определить имя канала ''

  • добавление атрибута "тип результата" в преобразователь с использованием StringResult. ошибка = неподдерживаемый тип полезной нагрузки [org.springframework.xml.transform.StringResult]

  • добавив оба вышеперечисленных. ошибка = не удалось определить имя канала ''

  • добавление атрибута «оценивать как строку» с использованием значения true. ошибка = неподдерживаемый тип полезной нагрузки.


Исходный файл конфигурации ниже:

<gateway id="gateway" default-request-channel="requestChannel"
          service-interface="foo.SomeClass" />


<beans:bean id="marshaller"
    class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <beans:property name="classesToBeBound">
        <beans:list>
            <beans:value>com.foo.Request</beans:value>
            <beans:value>com.foo.Record</beans:value>
            <beans:value>com.foo.Data</beans:value>
        </beans:list>
    </beans:property>
</beans:bean>

<chain input-channel="requestChannel">
  <poller max-messages-per-poll="10" task-executor="executor">
    <interval-trigger interval="5000" />
  </poller>

  <si-xml:marshalling-transformer marshaller="marshaller"/>

  <si-xml:xpath-router id="instockRouter" resolution-required="true">
    <si-xml:xpath-expression expression="/Request/Records/Record/data[@key='command']"/>
    <si-xml:mapping value="sendSMS" channel="SMSChannel"/>
  </si-xml:xpath-router>
</chain>

<task:executor id="executor" pool-size="8"/>

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Вы можете использовать Spring's "=object-to-string-transformer />" после сортировки.

0 голосов
/ 04 августа 2011

Из того, что я вижу:

  1. Сообщение поступает в шлюз, который направляет его в канал запроса
  2. обработка requestChannel передается в цепочку, которая на первом этапе маршаллизирует объект, используя org.springframework.oxm.jaxb.Jaxb2Marshaller в javax.xml.transform.dom.DOMResult
  3. Когда ваша полезная нагрузка имеет тип DOMResult, вы пытаетесь использовать xpath-router.

Насколько я знаю, маршрутизатор XPath работает нормально, если полезная нагрузка сообщения имеет тип String, содержащий простой XML внутри. Поэтому я бы рекомендовал не маршалировать ваше сообщение перед использованием маршрутизатора xpath, а сначала использовать маршрутизатор xpath.

Если вы выполните маршаллинг объекта, он будет иметь тип DOMResult, и вам придется иметь дело с DOMResult (грустно, но факт:))

... в любом случае, я думаю, что DOMResult - это не то, что вы хотите иметь в качестве полезной нагрузки сообщения - может быть, вы допустили ошибку между маршалингом и демаршаллингом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...