防止执行发送方通道,直到在Spring Integration中从拆分器完成处理中生成执行程序通道为止

问题描述 投票:0回答:1

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

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

<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的类尝试接收响应消息,但响应message为空,因此导致空指针异常。产生的5个线程继续执行,我可以看到请求已成功完成,最后,我可以看到要返回的最终响应,但是原始线程已经发送了空指针错误。

有没有一种方法可以阻止执行最初称为splitter的主线程?

@@@@@@@@@@@@@ ememem预先感谢您的帮助

当前,我的程序正在以单线程方式执行,在该程序中,它会遍历上下文文件并发出各种HTTP请求,并且来自HTTP请求的响应将用于创建...

java multithreading spring-integration
1个回答
0
投票
[您的MessagingGatewaySupport似乎配置了太短的replyTimeout。由于您将拆分后的消息发送到不同的线程中,因此在调用方中不再存在阻塞,因此它只进入receive()部分进行回复。
© www.soinside.com 2019 - 2024. All rights reserved.