Java 未调用管道中的下一个通道过滤器设计-Spring集成
我是Spring集成的新手,基本上只是在尝试学习。我正在尝试实现管道过滤器设计。其思想是将消息发送到一个通道,在该通道中,特定的消息端点处理该消息并将其传递到下一个通道。这是我的spring配置Java 未调用管道中的下一个通道过滤器设计-Spring集成,java,spring,spring-integration,Java,Spring,Spring Integration,我是Spring集成的新手,基本上只是在尝试学习。我正在尝试实现管道过滤器设计。其思想是将消息发送到一个通道,在该通道中,特定的消息端点处理该消息并将其传递到下一个通道。这是我的spring配置 <int:gateway id="instanceRequest" service-interface="com.trivialjava.rnd.spring_inttest.RequestProcessor"/> <!-- each request is checked for t
<int:gateway id="instanceRequest" service-interface="com.trivialjava.rnd.spring_inttest.RequestProcessor"/>
<!-- each request is checked for type and sent to proper channel -->
<int:channel id="requests"/>
<int:splitter input-channel="requests" expression="payload.request" output-channel="requestData"/>
<int:channel id="requestData"/>
<int:router input-channel="requestData" expression="payload.class.name">
<int:mapping value="com.trivialjava.rnd.entity.InstanceRequest" channel="instanceRequests"/>
<int:mapping value="com.trivialjava.rnd.entity.SolutionRequest" channel="solutionRequests"/>
</int:router>
<!-- instanceRequests are processed by the filter one -->
<int:channel id="instanceRequests">
<int:queue capacity="20"/>
</int:channel>
<int:service-activator input-channel="instanceRequests" ref="instanceRequestNameHandler" method="prepareName" output-channel="instanceRequestsDesc"/>
<!-- instanceRequestsDesc are processed by the filter two -->
<int:channel id="instanceRequestsDesc">
<int:queue capacity="20"/>
</int:channel>
<int:service-activator input-channel="instanceRequestsDesc" ref="instanceRequestDescHandler" method="prepareDesc" />
<beans:bean id="instanceRequestNameHandler" class="com.trivialjava.rnd.spring_inttest.InstanceNameRequestProcessor"/>
<beans:bean id="instanceRequestDescHandler" class="com.trivialjava.rnd.spring_inttest.InstanceDescRequestProcessor"/>
及
现在,当我调用传递InstanceRequest的网关时,只调用InstanceRequest的第一个通道,即instanceRequests,而不调用第二个通道,即instanceRequestsDesc。在日志中,我可以看到如下消息
13:54:09.077 DEBUG [main][org.springframework.integration.router.ExpressionEvaluatingRouter] Channel mappings:{} replaced with:{com.trivialjava.rnd.entity.InstanceRequest=instanceRequests, com.trivialjava.rnd.entity.SolutionRequest=solutionRequests}
13:54:15.334 DEBUG [main][org.springframework.integration.channel.QueueChannel] preSend on channel 'instanceRequests', message: GenericMessage [payload=com.trivialjava.rnd.entity.InstanceRequest@632da81b, headers={timestamp=1429898055334, id=6eada370-486c-7ab8-23df-38836782c846, correlationId=b0138751-8154-ff87-b2e2-dc5f8b2381d3, sequenceSize=1, sequenceNumber=1}]
13:54:15.334 DEBUG [main][org.springframework.integration.channel.QueueChannel] postSend (sent=true) on channel 'instanceRequests', message: GenericMessage [payload=com.trivialjava.rnd.entity.InstanceRequest@632da81b, headers={timestamp=1429898055334, id=6eada370-486c-7ab8-23df-38836782c846, correlationId=b0138751-8154-ff87-b2e2-dc5f8b2381d3, sequenceSize=1, sequenceNumber=1}]
但没有记录表明第二个通道已经初始化。我在Spring集成中遗漏了一些东西,一些配置或一些已知的设计问题。我在您的配置和代码中没有看到任何特定的内容。我猜你的日志中有一些异常,但不清楚在哪里。我建议您尝试使用DirectChannel解决方案。在这种情况下,将向调用方抛出一个异常:RequestProcessor启动器。感谢@ArtemBilan的输入。这是我的一个大错误。上述情况根本不是问题。我已经在处理程序InstanceNameRequestProcessor上设置了调试点。由于它是一个队列通道,一个单独的线程在调试点等待,我没有看到还有其他挂起的线程。
public class InstanceDescRequestProcessor {
private final Logger logger = LoggerFactory.getLogger(InstanceDescRequestProcessor.class);
public String prepareDesc(String request){
System.out.println(Thread.currentThread().getName()
+ " request desc #" + request );
logger.info(Thread.currentThread().getName()
+ " request desc #" + request );
return request;
}
}
13:54:09.077 DEBUG [main][org.springframework.integration.router.ExpressionEvaluatingRouter] Channel mappings:{} replaced with:{com.trivialjava.rnd.entity.InstanceRequest=instanceRequests, com.trivialjava.rnd.entity.SolutionRequest=solutionRequests}
13:54:15.334 DEBUG [main][org.springframework.integration.channel.QueueChannel] preSend on channel 'instanceRequests', message: GenericMessage [payload=com.trivialjava.rnd.entity.InstanceRequest@632da81b, headers={timestamp=1429898055334, id=6eada370-486c-7ab8-23df-38836782c846, correlationId=b0138751-8154-ff87-b2e2-dc5f8b2381d3, sequenceSize=1, sequenceNumber=1}]
13:54:15.334 DEBUG [main][org.springframework.integration.channel.QueueChannel] postSend (sent=true) on channel 'instanceRequests', message: GenericMessage [payload=com.trivialjava.rnd.entity.InstanceRequest@632da81b, headers={timestamp=1429898055334, id=6eada370-486c-7ab8-23df-38836782c846, correlationId=b0138751-8154-ff87-b2e2-dc5f8b2381d3, sequenceSize=1, sequenceNumber=1}]