Java 如何在Spring集成中从消息负载中获取对象值

Java 如何在Spring集成中从消息负载中获取对象值,java,spring,spring-integration,Java,Spring,Spring Integration,如下所示,我已经配置了拆分器,输入通道中的值将是spring集成的通用消息 一般信息 Map<String,Object> payload; values are serviceRequest=Some Object messageBusmessages= Some Object MessageHeaders headers; Map有效载荷; 价值观是 serviceRequest=某个对象 messageBusmessages=某个对象

如下所示,我已经配置了拆分器,输入通道中的值将是spring集成的通用消息

一般信息

Map<String,Object> payload;
    values are   
      serviceRequest=Some Object
      messageBusmessages= Some Object 

MessageHeaders headers;
Map有效载荷;
价值观是
serviceRequest=某个对象
messageBusmessages=某个对象
消息头;
现在,我的需求就像我想从有效负载中获取值,该有效负载通过键映射,并将一个放在messagebus.channel中,另一个放在servicebody.channel中

<int:splitter input-channel="outChannel"
    output-channel="messagebus.channel">
</int:splitter>

<int:splitter input-channel="outChannel"
    output-channel="servicebody.channel">
</int:splitter>

我认为您不需要拆分,我认为您需要基于内容的路由。如果可以,在消息的传入报头中添加一些内容,并使用现成的spring集成报头值路由器

<header-value-router input-channel="routingChannel" header-name="testHeader">
  <mapping value="serviceRequest" channel="messagebus.channel" />
  <mapping value="messageBusmessages" channel="servicebody.channel" />
</header-value-router>

如果这不适合你的需要。看看下面的链接,看看SpringIntegration为路由提供的所有选项

您可以将一个
与两个订阅者一起使用,这两个订阅者都是
s,具有适当的表达式

<int:publish-subscribe-channel id="outChannel"/>

<int:transformer input-channel="outChannel" outputChannel="messagebus.channel"
    expression="payload.['foo']"/>

<int:transformer input-channel="outChannel" outputChannel="servicebody.channel"
    expression="payload.['bar']"/>


这将连续处理;如果您想让它们并行运行,请在

上放置一个
任务执行器,使用表达式我们可以从有效负载映射中获取对象,并按照下面的要求将其放入通道选项对我有效

<int:splitter input-channel="outChannel" expression="payload.get('messagebusMesssages')"
    output-channel="message.channel">
</int:splitter>

<int:splitter input-channel="outChannel" expression="payload.get('serviceRequest')"
    output-channel="servicebody.channel">
</int:splitter>

<int:service-activator input-channel="servicebody.channel"
    ref="SITestAction" method="action" />


根据我们的要求,我们不想在标题中添加任何内容。如上所述,我已经应用了我的转换器,在outChannel中,我将接收GenericMessage对象,在GenericMessage有效负载中,我有messageBus消息和serviceRequest对象,我只想将有效负载反合成到通道中,这就是我使用splitterOk的原因,所以您尝试进行拆分和路由。拆分器本质上是将消息拆分,但它们不会基于内容重新路由,我认为这就是您感到困惑的地方。因此,我建议您使用Gary Russell选项,或者在流中编写一个拆分器,后跟一个路由器,您可以将其重定向到正确的通道。这里是一个路由器的示例,您可以根据有效负载属性确定消息应该指向哪个通道。