自定义重定序器行为

时间:2014-07-02 13:57:45

标签: spring-integration

我有一个场景,我必须发送消息才能进行休息服务,我计划使用重定序器。此重定序器的行为必须是:

  • 按时间排序消息(hh:mm:ss):消息数据

  • 只有在公共汽车停留一段时间后才发布消息(p.e. 2分钟)

由于默认的Resequencer不能用于此目的,我决定开发一个自定义的,更改CustomResequencerMessageGroupProcessor的ResequencerMessageGroupProcessor。

我成功使用了服务激活器,但我不得不明确地将输出通道定义为属性。是不是有办法在xml声明中使用output-channel属性?

当我使用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的

1 个答案:

答案 0 :(得分:0)

引用(ref)时MessageHandler <service-activator/>只有在引用的处理程序为output-channel(ARPMH)时才会应用XML AbstractReplyProducingMessageHandlerServiceActivatorFactoryBean

路由器,聚合器,重新排序器等组件不被视为ARPMH,因为它们有时会产生回复,有时候不会产生回复,如果是路由器,可能会产生多个回复&#34 ;这不适合服务激活模型。

我们可能会将聚合器/重定序器重构为AR​​PMH,因为它们只生成0或1&#34;回复&#34;。如果引用是AbstractCorrelatingMessageHandler,我们还可以向{{1}}添加一些智能以注入输出通道。随意打开Improvement JIRA Issue

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