我有一个spring集成流,它有一个服务激活器调用一个具有void结果的网关服务,它似乎挂起。它不会延续链的其余部分。我是否需要指定其他内容以表示我不希望从网关调用返回结果以继续执行线程?我有一个void方法声明。
服务
package foo;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Payload;
public interface myService {
void capitalString(String inputString ) ;
}
Spring Integration Flow
<import resource="classpath:META-INF/spring/integration/spring-integration-database-context.xml"/>
<context:property-placeholder location="classpath:META-INF/spring/integration/testApp.properties"/>
<!-- INTEGRATION FLOW - START -->
<int-file:inbound-channel-adapter
directory="file:${baseFilePath}\input"
id="filesInAdapter"
channel="inputChannel"
auto-startup="true">
<int:poller fixed-delay="5000" />
</int-file:inbound-channel-adapter>
<int:channel id="inputChannel"/>
<int:chain input-channel="inputChannel" >
<int:header-enricher id="fileNameHeaderEnricher" >
<int:header name="fileName" expression="payload.getName()"></int:header>
</int:header-enricher>
<int:service-activator id="serviceActivator" ref="myServiceGateway" method="capitalString" />
<!--write out the filename to the output file since void returns empty payload-->
<int:transformer id="payloadAppender" expression="headers['fileName']"/>
<int-file:outbound-channel-adapter id="filesOut" directory-expression=" '${defaultDirPath}' + 'Output\'" filename-generator-expression="'Output.txt'" /></int:chain>
<!-- INTEGRATION FLOW - END -->
<int:channel id="capitalStringStoredChannel" />
<int:gateway
id="myServiceGateway"
default-request-timeout="5000"
default-reply-timeout="5000"
default-request-channel="capitalStringStoredChannel"
service-interface="foo.CaptialStringService"
error-channel="errorsProc">
<int:method name="executeFoo" request-channel="capitalStringStoredChannel" />
</int:gateway>
<!-- LOOK HERE MY GATEWAY -->
<int-jdbc:stored-proc-outbound-gateway
id="outbound-gateway-enroll"
request-channel="capitalStringStoredChannel"
data-source="dataSource"
stored-procedure-name="CAPITALIZE_STRING"
>
<int-jdbc:parameter name="INOUTSTRING" expression="new java.lang.String(payload.split(',')[1])" />
</int-jdbc:stored-proc-outbound-gateway>
<!-- <int:logging-channel-adapter id="loggit" log-full-message="true"/>-->
调试日志 - 看起来像发送回复一样正确。我的文件适配器似乎没有被调用。
11:46:19.830 DEBUG [task-scheduler-1][org.springframework.integration.handler.ServiceActivatingHandler] handler 'ServiceActivator for [org.springframework.integration.handler.MethodInvokingMessageProcessor@c406eb8a] (org.springframework.integration.handler.MessageHandlerChain#0$child.serviceActivator)' produced no reply for request Message: GenericMessage [payload=00111,123, headers={sequenceNumber=1, sequenceSize=0, correlationId=fa3a8e43-49b2-fd90-9aaa-ed02e15b260e, FILE_NAME=file1_01.txt, timestamp=1488987979508}]
11:46:19.830 DEBUG [task-scheduler-1][org.springframework.integration.channel.DirectChannel] postSend (sent=true) on channel 'inputChannel', message: GenericMessage [payload=filename.txt, headers={id=904ee554-638d-eddf-efb5-7d4de30f4882, timestamp=1488987979489}]
答案 0 :(得分:1)
行。看,<chain>
期望生成回复中的所有组件都移动到链中的下一个组件。前一个组件的回复是链中下一个组件的输入。因此,真正期望的是,由于您的网关不返回任何内容,因此没有任何内容可以发送到链中的下一个组件。
如果您真的不希望从网关获得答案,就像“发送并忘记”一样,请考虑切换到publish-subscribe-channel
以向void
网关发送相同的消息以及主流程中的下一个组件。是的,我们必须打破你当前的链条,否则当前的方法对你来说无论如何都不会有用。