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像处理其他任何消息一样处理它?
服务激活器章节中有一些关于此事的信息:
服务激活器是不需要生成回复消息的组件之一。如果您的方法返回 null 或具有 void 返回类型,则 Service Activator 在方法调用后退出,没有任何信号。此行为可以由 AbstractReplyProducingMessageHandler.requiresReply 选项控制,在使用 XML 命名空间进行配置时,也公开为 requires-reply。如果该标志设置为 true 并且该方法返回 null,则抛出 ReplyRequiredException。
您也可以在JIRA 中找到一些讨论。
一般来说,null有效载荷在消息传递中没有意义,必须将其视为终端信号或错误,如ReplyRequiredException.
对于您的用例,您应该考虑RawMessageData从您的服务激活器返回一些实例,您可以将其视为null.