Spring Integration Service Activator不发送空回复

whe*_*ler 5 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>
Run Code Online (Sandbox Code Playgroud)

服务激活器正在调用的方法尝试将消息中的数据与DB中的某些数据进行匹配。如果是,它将返回匹配的数据。如果没有,它将返回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.,
Run Code Online (Sandbox Code Playgroud)

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

这是我的网关服务接口:

public interface MessagingGateway {

    RawMessageData publishReturnedTransaction(ReturnedTransactionData returnedTransactionData) throws ChannelPublishException;
}
Run Code Online (Sandbox Code Playgroud)

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

Art*_*lan 5

服务激活器章节中有一些关于此事的信息:

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

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

一般来说,null有效载荷在消息传递中没有意义,必须将其视为终端信号或错误,如ReplyRequiredException.

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