【问题标题】:Spring integration service activator not sending null replySpring集成服务激活器不发送空回复
【发布时间】:2017-04-20 16:12:52
【问题描述】:

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

    <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=truenull 回复似乎会从集成流程中消失,导致服务接口永远不会返回,从而导致应用程序挂起。如果我确实设置了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

【问题讨论】:

    标签: java spring-integration


    【解决方案1】:

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

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

    你也可以在JIRA找到一些讨论。

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

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

    【讨论】:

    • 该死,我希望不是这样。 Spring 开发人员似乎相当傲慢地随意编辑这样的用例,并试图用诸如“各种处理程序不知道如何处理有效负载”之类的废话来证明它的合理性,而不是让我决定他们应该如何处理它。真可怜。
    • 好的。我没有这么仔细地考虑这个问题,但是请您随时通过此 SO 问题的链接向该 JIRA 提供您的反馈。谢谢你!
    • 我对讨论中的反应更加挑剔。您提供的答案非常清晰简洁,即使这不是我想听到的:)
    • 很遗憾,null 不能被视为适当的payload 值。
    • 你可以发送 Optional 代替
    猜你喜欢
    • 1970-01-01
    • 2013-01-08
    • 2012-07-22
    • 2019-12-28
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2017-01-03
    • 2019-01-15
    相关资源
    最近更新 更多