如何使用Spring Integration 2.0.5基于内容路由消息?

时间:2011-08-03 20:21:43

标签: java spring-integration

我开始使用si-xml:xpath-router但我遇到了障碍。我使用正确的路由器但执行错误吗?如果我使用的是错误的路由器,我应该使用哪一个,即默认路由器,有效负载类型,或者可能是一个简单的SpEL表达式?

使用案例

我需要根据有效负载内容路由消息。该请求包含一个元素,我需要执行的“操作”包含在其中一个属性中,请参阅下面的属性“command”

示例入站请求(来自Web服务)。

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

伪造的代码是:

  • marshall message。
  • 基于值的路由,通过xpath-router

但是我收到了错误:

不支持的有效内容类型[javax.xml.transform.dom.DOMResult]


为了解决这个问题,我尝试过:

  • 使用ResultToDocumentTransformer将属性“result-transformer”添加到变换器bean。 错误 =无法解析频道名称''

  • 使用StringResult将属性“result-type”添加到变换器。 错误 =不支持的有效内容类型[org.springframework.xml.transform.StringResult]

  • 添加以上两者。 错误 =无法解析频道名称''

  • 使用true添加属性“evaluate-as-string”。 错误 =不支持的有效内容类型。


以下原始配置文件:                 

<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 个答案:

答案 0 :(得分:2)

您可以在编组后使用Spring的"=object-to-string-transformer />"

答案 1 :(得分:0)

从我所看到的:

  1. 消息进入网关,将其转发到requestChannel
  2. requestChannel处理被转发到链中,在第一步中使用org.springframework.oxm.jaxb.Jaxb2Marshaller将对象编组到javax.xml.transform.dom.DOMResult
  3. 当您的有效负载为DOMResult类型时,您尝试使用xpath-router。
  4. 据我所知,如果消息有效内容是包含普通XML的String类型,XPath路由器可以正常工作。所以我建议在使用xpath路由器之前不要编写你的消息,而是首先使用xpath路由器。

    如果你要编组该对象,它将是DOMResult类型,你将不得不处理DOMResult(悲伤但是真实的:))

    ...无论如何我认为DOMResult不是你想要的消息有效载荷 - 也许你在编组和解组之间犯了错误?