Java 未调用管道中的下一个通道过滤器设计-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

我是Spring集成的新手,基本上只是在尝试学习。我正在尝试实现管道过滤器设计。其思想是将消息发送到一个通道,在该通道中,特定的消息端点处理该消息并将其传递到下一个通道。这是我的spring配置

<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}]