gpt4 book ai didi

java - 防止发送者 channel 的执行,直到从分离器生成的执行器 channel 完成 Spring Integration 中的处理

转载 作者:行者123 更新时间:2023-12-02 09:08:56 24 4
gpt4 key购买 nike

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

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

<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 个线程继续执行,我可以看到请求已成功发出,最后,我可以看到我想要返回的最终响应,但原始线程已经发回了空指针错误。

有没有办法阻止原来调用分割器的主线程执行?

提前感谢@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)静态最终长DEFAULT_TIMEOUT = 1000L;

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

关于java - 防止发送者 channel 的执行,直到从分离器生成的执行器 channel 完成 Spring Integration 中的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59566369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com