Spring integration 自定义重排序器行为

Spring integration 自定义重排序器行为,spring-integration,Spring Integration,我有一个场景,在这个场景中,我必须向rest服务发送消息,并且我计划使用重排序器。此重排序器的行为必须是: 按时间(hh:mm:ss)订购邮件:邮件上的数据 仅在信息在公交车上停留一段时间后发布(即2分钟) 由于默认的重排程序不适用于此目的,我决定开发一个定制的重排程序,将重排消息组处理器更改为定制的重排消息组处理器 我成功地使用了服务激活器,但我必须明确地将输出通道定义为属性。有没有一种方法可以在xml声明中使用output channel属性 使用“输出通道”属性时,会发生以下错误: C

我有一个场景,在这个场景中,我必须向rest服务发送消息,并且我计划使用重排序器。此重排序器的行为必须是:

  • 按时间(hh:mm:ss)订购邮件:邮件上的数据

  • 仅在信息在公交车上停留一段时间后发布(即2分钟)

由于默认的重排程序不适用于此目的,我决定开发一个定制的重排程序,将重排消息组处理器更改为定制的重排消息组处理器

我成功地使用了服务激活器,但我必须明确地将输出通道定义为属性。有没有一种方法可以在xml声明中使用output channel属性

使用“输出通道”属性时,会发生以下错误:

Caused by: java.lang.IllegalArgumentException: no outputChannel or replyChannel header   available
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.integration.aggregator.AbstractCorrelatingMessageHandler.sendReplies(AbstractCorrelatingMessageHandler.java:616)
at org.springframework.integration.aggregator.AbstractCorrelatingMessageHandler.completeGroup(AbstractCorrelatingMessageHandler.java:597)
at org.springframework.integration.aggregator.AbstractCorrelatingMessageHandler.handleMessageInternal(AbstractCorrelatingMessageHandler.java:405)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
... 46 more
下面是我的例子:

<int:channel id="resequencerChannel"/>


<int:service-activator id="customResequencer" ref="resequencingMessageHandler" 
        input-channel="resequencerChannel" />

<int:channel id="aggregatedMessageChannel" />

<bean id="resequencingMessageHandler" class="org.springframework.integration.aggregator.ResequencingMessageHandler">
    <constructor-arg name="releaseStrategy"  ref="timeoutReleaseStrategy"/>
    <constructor-arg name="processor" ref="customResequencerMessageGroupProcessor"/>
    <constructor-arg name="store" ref="redisMessageStore"/>
    <constructor-arg name="correlationStrategy" ref="customCorrelationStrategy"/>
    <property name="outputChannel" ref="aggregatedMessageChannel"/>
    <property name="sendPartialResultOnExpiry" value="true"></property>
</bean>

<bean id="customResequencerMessageGroupProcessor" class="test.resequencer.CustomResequencerMessageGroupProcessor">
    <constructor-arg name="timeout" value="10000"/>
</bean>

<bean id="timeoutReleaseStrategy" class="org.springframework.integration.aggregator.TimeoutCountSequenceSizeReleaseStrategy" >
    <constructor-arg name="threshold" value="100000"></constructor-arg>
    <constructor-arg name="timeout" value="10000"/>
</bean>

<bean id="customCorrelationStrategy" class="org.springframework.integration.aggregator.HeaderAttributeCorrelationStrategy" >
    <constructor-arg name="attributeName" value="correlationId"/>

另外,如果你认为有更好的方法,请告诉我

提前谢谢

问候

Guzman

引用(
ref
)一个
MessageHandler
时,仅当引用的处理程序是
AbstractReplyProducingMessageHandler
(ARPMH)时,才会应用XML
输出通道

路由器、聚合器、重排序器等组件不被视为ARPMHs,因为它们有时生成应答,有时不生成,并且在路由器的情况下,可能会生成多个不符合服务激活器模型的“应答”

我们可能会将聚合器/重排序器重构为ARPMHs,因为它们只生成0或1个“回复”。如果引用是
AbstractCorrelationMessageHandler
,我们还可以向
ServiceActivatorFactoryBean
添加一些smarts来注入输出通道。请随意打开一个


同时,您的解决方案是正确的解决方案。

嗨,加里!非常感谢您的快速回答和评论。我会这样做的。