Spring 来自收件人列表路由器的异步调用

Spring 来自收件人列表路由器的异步调用,spring,spring-integration,Spring,Spring Integration,我是SI的新手,但现在读了很多书。我必须从flow中再调用1个,这已经实现了。我需要这个调用不被阻塞,这样链就不会等待它的执行——它被发送到另一个系统,这个系统可能已经关闭 我需要向两个通道发送消息,所以我使用了收件人列表路由器,没有任何条件 <int:recipient-list-router id="processEngineRouter" input-channel="newApplicationChannel"> <int:recipient channel="

我是SI的新手,但现在读了很多书。我必须从flow中再调用1个,这已经实现了。我需要这个调用不被阻塞,这样链就不会等待它的执行——它被发送到另一个系统,这个系统可能已经关闭

我需要向两个通道发送消息,所以我使用了收件人列表路由器,没有任何条件

<int:recipient-list-router id="processEngineRouter" input-channel="newApplicationChannel">
    <int:recipient channel="finishFlowChannel"/>
    <int:recipient channel="processEngineChannel"/>
</int:recipient-list-router>
其中
任务
前缀来自版本3.1,没有其他设置

路由器的输入通道为

<int:channel id="newApplicationChannel"/>
<int:channel id="naRequestChannel"/>
<int:chain input-channel="naRequestChannel" output-channel="newApplicationChannel">

    <int:transformer>
        ...
    </int:transformer>

    <si-xml:unmarshalling-transformer unmarshaller="xxMarshaller"/>

    <!-- enrich header with necessary data -->
    <int:header-enricher>
        ...
    </int:header-enricher>

    <!-- transform xx to yy -->
    <int:transformer ref="xxToYyTransformer"/>

    <!-- call yyy service -->
    <int:gateway request-channel="yyyServiceRequestChannel"/>

</int:chain>

它工作得很好

...
http-apr-8080-exec-2 14:39:24,224 DEBUG DirectChannel:224 - preSend on channel 'apiReplyChannel', message: 
http-apr-8080-exec-2 14:39:24,224 DEBUG MessageTransformingHandler:67 - 
http-apr-8080-exec-2 14:39:24,235 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'apiReplyChannel', message: 
http-apr-8080-exec-2 14:39:24,236 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'finishFlowChannel', message: 
http-apr-8080-exec-2 14:39:24,236 DEBUG ExecutorChannel:224 - preSend on channel 'processEngineChannel', message: 
http-apr-8080-exec-2 14:39:24,239 DEBUG ExecutorChannel:237 - postSend (sent=true) on channel 'processEngineChannel', message: 
taskExecutor-1 14:39:24,239 DEBUG MessageHandlerChain:67 - org.springframework.integration.handler.MessageHandlerChain#34 received message: 
http-apr-8080-exec-2 14:39:24,239 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'newApplicationChannel', message: 
taskExecutor-1 14:39:24,240 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler@289f6ae received message: 
http-apr-8080-exec-2 14:39:24,240 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'naRequestChannel', message: 
http-apr-8080-exec-2 14:39:24,241 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'apiRequestChannel', message: 
taskExecutor-1 14:39:27,817 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler@289f6ae' sending reply Message: 
...
如您所见,
…exec-2
线程在
apiReplyChannel
上发送回复,然后在
进程引擎通道上执行发送(发送前和发送后是背靠背的),并将其交给线程
任务执行器-1
,然后开始处理该通道链、转换器等上的流

…exec-2
线程继续完成其工作(以
APIRestChannel
上的postSend结束)


但是,我发现processEngineChannel链上没有输出通道-框架将尝试将该回复发送到消息的
replyChannel
标题中的任何内容-如果要放弃该回复,应将该链的
输出通道设置为nullChannel。

不清楚您的意思“input newApplicationChannel也会等待processEngineChannel完成,”-通道不会“等待”任何内容。与往常一样,打开调试日志记录(包括log4j的线程-
%t
-在调试这些东西时总是有帮助的。注意,当从“newApplicationChannel”调用路由器时,进程直到“processEngineChannel”完成才结束。我可以在调试中看到,“finishFlowChannel”postSend()调用了,但我看到,我也必须等待“processEngineChannel”完成。我想调用“processEngineChannel”,而不是等待它运行。我需要查看上游和下游(两条腿)你所描述的对我来说没有任何意义;调用线程向执行线程进行异步切换,任何东西都不应该“等待”"。您还应该显示您的
taskExecutor
配置。例如,如果执行器是
SyncTaskExecutor
,则当然不会进行线程切换。我更改了代码。如果我需要以某种方式更改执行器,请告诉我。我仍然不明白为什么会有等待-除非
naR的上游有任何更改equestChannel
正在等待回复,而finishFlowChannel
上的流没有生成回复。但这不能通过添加延迟器来解决。我想我需要查看调试日志(包括log4j的线程
%t
)。
http-apr-8080-exec-2 14:39:23,530 DEBUG DirectChannel:224 - preSend on channel 'apiRequestChannel'
http-apr-8080-exec-2 14:39:23,534 DEBUG MessageHandlerChain:67 - org.springframework.integration.handler.MessageHandlerChain#4
http-apr-8080-exec-2 14:39:23,535 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler#4ac5c32e
http-apr-8080-exec-2 14:39:23,557 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler#4ac5c32e' sending reply 
http-apr-8080-exec-2 14:39:23,557 DEBUG HeaderValueRouter:67 - (inner bean)#16 received message: 
http-apr-8080-exec-2 14:39:23,558 DEBUG DirectChannel:224 - preSend on channel 'naRequestChannel', message: 
http-apr-8080-exec-2 14:39:23,558 DEBUG MessageHandlerChain:67 - org.springframework.integration.handler.MessageHandlerChain#33 received message: 
http-apr-8080-exec-2 14:39:23,558 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler@3cbcf04e received message: 
http-apr-8080-exec-2 14:39:23,565 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler@3cbcf04e' sending reply 
http-apr-8080-exec-2 14:39:23,566 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler#6a5c2445 received message: 
http-apr-8080-exec-2 14:39:23,594 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler#6a5c2445' sending reply 
http-apr-8080-exec-2 14:39:23,595 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler#47516490 received message: 
http-apr-8080-exec-2 14:39:23,596 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler#47516490' sending reply 
http-apr-8080-exec-2 14:39:23,596 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler@2342f67d received message: 
http-apr-8080-exec-2 14:39:23,597 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler@2342f67d' sending reply 
http-apr-8080-exec-2 14:39:23,598 DEBUG RequestReplyMessageHandlerAdapter:67 - (inner bean)#231 received message: 
http-apr-8080-exec-2 14:39:23,600 DEBUG DirectChannel:224 - preSend on channel 'dossierAddEventRequestChannel', message: 
http-apr-8080-exec-2 14:39:23,601 DEBUG PayloadTypeRouter:67 - (inner bean)#250 received message: 
http-apr-8080-exec-2 14:39:23,602 DEBUG DirectChannel:224 - preSend on channel 'dossierAddEventRequestGenericChannel', message: 
http-apr-8080-exec-2 14:39:23,602 DEBUG MessageHandlerChain:67 - org.springframework.integration.handler.MessageHandlerChain#41 received message: 
http-apr-8080-exec-2 14:39:23,603 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler#23bdb02e received message: http-apr-8080-exec-2 14:39:23,603 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler#23bdb02e' sending reply http-apr-8080-exec-2 14:39:23,604 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler@54054c41 received message: http-apr-8080-exec-2 14:39:23,606 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler@54054c41' sending reply http-apr-8080-exec-2 14:39:23,606 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'dossierAddEventRequestGenericChannel', message: http-apr-8080-exec-2 14:39:23,607 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'dossierAddEventRequestChannel', message: 
http-apr-8080-exec-2 14:39:23,607 DEBUG GatewayProxyFactoryBean:134 - Unable to attempt conversion of Message payload types. Component 'org.springframework.integration.gateway.GatewayProxyFactoryBean#2e29d50d' has no explicit ConversionService reference, and there is no 'integrationConversionService' bean within the context.
http-apr-8080-exec-2 14:39:23,608 DEBUG RequestReplyMessageHandlerAdapter:156 - handler '(inner bean)#231' sending reply Message: http-apr-8080-exec-2 14:39:23,608 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler@3f03c0ad received message: 
http-apr-8080-exec-2 14:39:23,609 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler@3f03c0ad' sending reply http-apr-8080-exec-2 14:39:23,611 DEBUG RequestReplyMessageHandlerAdapter:67 - (inner bean)#232 received message: http-apr-8080-exec-2 14:39:23,612 DEBUG DirectChannel:224 - preSend http-apr-8080-exec-2 14:39:23,612 DEBUG ServiceActivatingHandler:67 - ServiceActivator for [org.springframework.integration.handler.MethodInvokingMessageProcessor@4149888e] received http-apr-8080-exec-2 14:39:23,614 DEBUG DirectChannel:224 - preSend on channel 'dossierServiceRequestRouter', message: http-apr-8080-exec-2 14:39:23,614 DEBUG PayloadTypeRouter:67 - (inner bean)#17 received message: 
http-apr-8080-exec-2 14:39:23,615 DEBUG DirectChannel:224 - preSend on channel 'dossierServiceJaxbRequestChannel', message: http-apr-8080-exec-2 14:39:23,616 DEBUG MessageHandlerChain:67 - org.springframework.integration.handler.MessageHandlerChain#5 received message: 
http-apr-8080-exec-2 14:39:23,616 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler#7d8e9adf received message: http-apr-8080-exec-2 14:39:23,634 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler#7d8e9adf' sending reply http-apr-8080-exec-2 14:39:23,635 DEBUG RequestReplyMessageHandlerAdapter:67 - (inner bean)#18 received message: [Payload=[#document: null]][Headers={timestamp=1372768763634, http-apr-8080-exec-2 14:39:23,636 DEBUG DirectChannel:224 - preSend on channel 'dossierServiceDocumentRequestChannel', message: 
http-apr-8080-exec-2 14:39:23,636 DEBUG SimpleWebServiceOutboundGateway:67 - org.springframework.integration.ws.SimpleWebServiceOutboundGateway#0 received message: http-apr-8080-exec-2 14:39:24,206 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'dossierServiceDocumentRequestChannel', message: [Payload=[#document: null]][Headers={timestamp=1372768763636, id=a193877c-0faf-4573-b6b4-97ca3cd25f66, errorChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@3875c597, xp_dossierEvent_operator_username=afs-process, xp_dossierEvent_name=NewApplication, replyChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@3875c597, xp_dossierEvent_dateTime=2013-07-02T14:39:23, xp_dossierEvent_details=Nieuwe aanvraag aangemaakt, xp_dossierEvent_operator_name=AFS Proces, xp_endUser=nl.vwpfs.pos.bpf.EndUser@598ef578, xp_businessFunctionName=NewApplication}]
http-apr-8080-exec-2 14:39:24,206 DEBUG GatewayProxyFactoryBean:134 - Unable to attempt conversion of Message payload types. Component 'org.springframework.integration.gateway.GatewayProxyFactoryBean#1d59e6df' has no explicit ConversionService reference, and there is no 'integrationConversionService' bean within the context.
http-apr-8080-exec-2 14:39:24,207 DEBUG RequestReplyMessageHandlerAdapter:156 - handler '(inner bean)#18' sending reply Message: 
http-apr-8080-exec-2 14:39:24,207 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler#79444986 received message: http-apr-8080-exec-2 14:39:24,218 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler#79444986' sending reply http-apr-8080-exec-2 14:39:24,219 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'dossierServiceJaxbRequestChannel', message: http-apr-8080-exec-2 14:39:24,219 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'dossierServiceRequestRouter', message: 
http-apr-8080-exec-2 14:39:24,219 DEBUG GatewayProxyFactoryBean:134 - Unable to attempt conversion of Message payload types. Component 'dossierServiceGateway' has no explicit ConversionService reference, and there is no 'integrationConversionService' bean within the context.
http-apr-8080-exec-2 14:39:24,220 DEBUG ServiceActivatingHandler:156 - handler 'ServiceActivator for http-apr-8080-exec-2 14:39:24,220 DEBUG GatewayProxyFactoryBean:134 - Unable to attempt conversion of Message payload types. Component 'org.springframework.integration.gateway.GatewayProxyFactoryBean#5e970110' has no explicit ConversionService reference, and there is no 'integrationConversionService' bean within the context.
http-apr-8080-exec-2 14:39:24,221 DEBUG RequestReplyMessageHandlerAdapter:156 - handler '(inner bean)#232' sending reply Message: http-apr-8080-exec-2 14:39:24,221 DEBUG DirectChannel:224 - preSend on channel 'newApplicationChannel', message: 
http-apr-8080-exec-2 14:39:24,221 DEBUG RecipientListRouter:67 - org.springframework.integration.router.RecipientListRouter#0 received message: http-apr-8080-exec-2 14:39:24,222 DEBUG DirectChannel:224 - preSend on channel 'finishFlowChannel', message: http-apr-8080-exec-2 14:39:24,222 DEBUG MessageHandlerChain:67 - org.springframework.integration.handler.MessageHandlerChain#35 received message: [Payload=nl.vwpfs.pos.xmlcdm.dossier.service.CreateDossierResponse@6b37695c
http-apr-8080-exec-2 14:39:24,222 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler@57316e85 received message: http-apr-8080-exec-2 14:39:24,223 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler@57316e85' sending reply http-apr-8080-exec-2 14:39:24,224 DEBUG DirectChannel:224 - preSend on channel 'apiReplyChannel', message: http-apr-8080-exec-2 14:39:24,224 DEBUG MessageTransformingHandler:67 - http-apr-8080-exec-2 14:39:24,235 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'apiReplyChannel', message: http-apr-8080-exec-2 14:39:24,236 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'finishFlowChannel', message: 
http-apr-8080-exec-2 14:39:24,236 DEBUG ExecutorChannel:224 - preSend on channel 'processEngineChannel', message: 
http-apr-8080-exec-2 14:39:24,239 DEBUG ExecutorChannel:237 - postSend (sent=true) on channel 'processEngineChannel', message: 
taskExecutor-1 14:39:24,239 DEBUG MessageHandlerChain:67 - org.springframework.integration.handler.MessageHandlerChain#34 received message: 
http-apr-8080-exec-2 14:39:24,239 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'newApplicationChannel', message: 
taskExecutor-1 14:39:24,240 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler@289f6ae received message: 
http-apr-8080-exec-2 14:39:24,240 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'naRequestChannel', message: 
http-apr-8080-exec-2 14:39:24,241 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'apiRequestChannel', message: 
taskExecutor-1 14:39:27,817 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler@289f6ae' sending reply Message: 
taskExecutor-1 14:39:27,819 DEBUG RequestReplyMessageHandlerAdapter:67 - (inner bean)#235 received message: 
taskExecutor-1 14:39:27,822 DEBUG DirectChannel:224 - preSend on channel 'sendToProcessEngineChannel', message: 
taskExecutor-1 14:39:27,822 DEBUG MarshallingWebServiceOutboundGateway:67 - org.springframework.integration.ws.MarshallingWebServiceOutboundGateway#0 received message: 
taskExecutor-1 14:39:28,094 DEBUG MarshallingWebServiceOutboundGateway:156 - handler 'org.springframework.integration.ws.MarshallingWebServiceOutboundGateway#0' sending reply 
taskExecutor-1 14:39:28,095 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'sendToProcessEngineChannel', message: 
taskExecutor-1 14:39:28,095 DEBUG GatewayProxyFactoryBean:134 - Unable to attempt conversion of Message payload types. Component 'org.springframework.integration.gateway.GatewayProxyFactoryBean#762589c3' has no explicit ConversionService reference, and there is no 'integrationConversionService' bean within the context.
taskExecutor-1 14:39:28,095 DEBUG RequestReplyMessageHandlerAdapter:156 - handler '(inner bean)#235' sending reply Message: 
...
http-apr-8080-exec-2 14:39:24,224 DEBUG DirectChannel:224 - preSend on channel 'apiReplyChannel', message: 
http-apr-8080-exec-2 14:39:24,224 DEBUG MessageTransformingHandler:67 - 
http-apr-8080-exec-2 14:39:24,235 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'apiReplyChannel', message: 
http-apr-8080-exec-2 14:39:24,236 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'finishFlowChannel', message: 
http-apr-8080-exec-2 14:39:24,236 DEBUG ExecutorChannel:224 - preSend on channel 'processEngineChannel', message: 
http-apr-8080-exec-2 14:39:24,239 DEBUG ExecutorChannel:237 - postSend (sent=true) on channel 'processEngineChannel', message: 
taskExecutor-1 14:39:24,239 DEBUG MessageHandlerChain:67 - org.springframework.integration.handler.MessageHandlerChain#34 received message: 
http-apr-8080-exec-2 14:39:24,239 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'newApplicationChannel', message: 
taskExecutor-1 14:39:24,240 DEBUG MessageTransformingHandler:67 - org.springframework.integration.transformer.MessageTransformingHandler@289f6ae received message: 
http-apr-8080-exec-2 14:39:24,240 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'naRequestChannel', message: 
http-apr-8080-exec-2 14:39:24,241 DEBUG DirectChannel:237 - postSend (sent=true) on channel 'apiRequestChannel', message: 
taskExecutor-1 14:39:27,817 DEBUG MessageTransformingHandler:156 - handler 'org.springframework.integration.transformer.MessageTransformingHandler@289f6ae' sending reply Message: 
...