阻止执行发送方通道,直到从拆分器生成的执行器通道完成 Spring 集成中的处理



目前,我的程序以单线程方式执行,它通过上下文文件并发出各种HTTP请求,这些来自HTTP请求的响应用于使用XSLT创建最终响应。我现在正在尝试对其中一些请求进行多线程处理,因为只有来自第一个 HTTP 请求的数据需要在后续请求中使用。

到目前为止,我已经创建了一个拆分器,它会产生 5 条不同的消息。输出通道是线程池大小为 5 的执行器通道。输出通道是一个标头值路由器,它使用在拆分器中添加的标头来决定将消息发送到上下文文件的哪个部分。

<splitter input-channel="spliter-input" output-channel="splitter-output" ref="MultiThreadedSplitter" method="split" />
<channel id="splitterRouter">
<dispatcher task-executor="splitterExecutor" />
<channel/>
<task:executor id="splitterExecutor" pool-size="5" /> 
<header-value-router input-channel="splitter-output" header-name="splitHeader">
<mapping value="httpRequest1" channel="httpRequest1" />
...
<mapping value="httpRequest5" channel="httpRequest5" />
<header-value-router/>

以上都是有效的,因为我可以在我生成的日志中看到,请求是以多线程方式发出的,所有这些都具有不同的线程上下文。除了我遇到的问题是,原始线程似乎正在尝试继续上下文文件并完成消息的发送和接收,因此我创建的扩展 MessagingGatewaySupport 的类尝试接收响应消息,但响应消息为空,从而导致空指针异常。生成的 5 个线程继续执行,我可以看到请求正在成功发出,最后,我可以看到我想要返回的最终响应,但原始线程已经发回了空指针错误。

有没有办法防止最初调用拆分器的主线程的执行?

@Artem提前感谢您对此:P的帮助

看起来您的MessagingGatewaySupport配置了太短的replyTimeout。由于您将拆分的消息发送到不同的线程中,因此调用方不再阻塞,因此它只是转到回复的receive()部分。

/**
* Set the timeout value for receiving reply messages. If not
* explicitly configured, the default is one second.
* @param replyTimeout the timeout value in milliseconds
*/
public void setReplyTimeout(long replyTimeout) {

private static final long DEFAULT_TIMEOUT = 1000L;

如果你最后真的回复一些回复,这一切都会很好。 如果您根本没有它并且仍然想阻止直到某个事件,请考虑使用Barrier组件:https://docs.spring.io/spring-integration/reference/html/message-routing.html#barrier

最新更新