我遇到了多线程问题,整个过程流应该在30秒内运行
第一个来源:200个工作的总清单 第二个来源:拆分器通过从第一个来源中获取作业ID来分别调用第二个来源
拆分后,我会将其传递给队列以调用服务激活器,然后再调用 http出站网关。但是,由于它当前是单线程,因此将面临一个问题,即在30秒内它无法完成所有200个作业
<int:splitter input-channel="AdapterCollectTransformJobChannel" output-channel="AdapterCollectTransformJobChannelSplit" ref="processesSplitter" />
<int:channel id="AdapterCollectTransformJobChannelSplit">
<int:interceptors>
<int:wire-tap channel="invokeJobGeneralChannel" />
</int:interceptors>
</int:channel>
<int:service-activator input-channel="invokeJobGeneralChannel" ref="AD001JobGeneralServiceActivator">
<int:poller fixed-delay="0" />
</int:service-activator>
<int:gateway default-request-channel="AdapterCollectRequestChannel"
service-interface="adapter.ad001.AD001CollectGateway">
<int:method name="invoke" payload-expression="#args[0]" reply-timeout="5000">
<int:header name="Content-Type" value="application/json" />
<int:header name="HttpMethod" value="GET" />
<int:header expression="#args[1]" name="HttpUri" />
<int:header expression="#args[2]" name="AccountId" />
<int:header expression="#args[3]" name="MachineId" />
<int:header expression="#args[4]" name="ApiName" />
</int:method>
</int:gateway>
日志: Thread log
更新2:
日志:enter link description here
Xml:enter link description here
我意识到该请求将从附带的日志中得到覆盖。
答案 0 :(得分:0)
首先,您的invokeJobGeneralChannel
服务激活器没有任何并行性。仅仅因为PollingConsumer
从单个呼叫中轮询队列中的消息就和队列中轮询的消息一样多。因此,服务的调用发生在单个线程中。
要使其真正成为多线程,您需要在拆分器之后配置ExecutorChannel
而不是QueueChannel
。
另一方面,不清楚为什么将http outbound gateway
视为单线程吗?绝对不正确,因为我们完全可以并行调用REST。
请分享更多证据,为什么您认为它是单线程的。