Spring集成服务激活器不发送空回复

时间:2017-04-20 16:12:52

标签: java spring-integration

我有一个非常简单的集成流程:

    <int:gateway id="integrationGateway"
                 service-interface="com.wheeler.fits.returns.messaging.MessagingGateway"
                 default-request-channel="transactionMatcher">
        <int:method name="publishReturnedTransaction" request-channel="transactionMatcher"/>
    </int:gateway>

    <int:channel id="transactionMatcher"/>
    <int:service-activator input-channel="transactionMatcher" requires-reply="true">
        <bean class="com.wheeler.fits.returns.domain.MatchTransactionToOriginal">
            <constructor-arg ref="achTransactionMapper"/>
            <constructor-arg ref="bankTransactionDao"/>
            <constructor-arg ref="clientMapper"/>
            <constructor-arg ref="oldAchTransactionMapper"/>
        </bean>
    </int:service-activator>

服务激活器调用的方法尝试将消息中的数据与数据库中的某些数据进行匹配。如果是,则返回匹配的数据。如果没有,则返回null

如果我没有设置required-reply=true,则null回复似乎从集成流中消失,导致服务接口永不返回,导致应用挂起。如果我设置required-reply=true,我至少会得到一个例外,但应用程序仍然挂起,因为网关的服务接口永远不会返回:

[org.springframework.integration.handler.ReplyRequiredException: No reply produced by handler 'org.springframework.integration.config.ServiceActivatorFactoryBean#0', and its 'requiresReply' property is set to true.,

在Spring集成参考资料中的任何地方都没有记录此行为。我希望我的服务激活器将null传递回网关,以便网关可以使用null进行回复。

这是我的网关服务接口:

public interface MessagingGateway {

    RawMessageData publishReturnedTransaction(ReturnedTransactionData returnedTransactionData) throws ChannelPublishException;
}

如何像其他任何消息一样处理null

1 个答案:

答案 0 :(得分:4)

Service Activator章节中有关于此事的一些信息:

  

Service Activator是生成回复消息所不需要的组件之一。如果您的方法返回null或具有void返回类型,则Service Activator在方法调用之后退出,没有任何信号。此行为可以通过AbstractReplyProducingMessageHandler.requiresReply选项控制,在使用XML命名空间进行配置时也会显示为requires-reply。如果该标志设置为true并且该方法返回null,则抛出ReplyRequiredException。

您还可以在JIRA中找到一些讨论。

一般来说,null有效负载在消息传递中没有意义,必须像ReplyRequiredException一样被视为终端信号或错误。

对于您的用例,您应该考虑从服务激活器返回一些RawMessageData实例,您可以将其视为null