管道过滤器设计中的下一个通道未被调用 - Spring Integration

时间:2015-04-24 20:00:00

标签: java spring spring-integration

我是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"/> 

我有Request接口,有两个实现InstanceRequest和SolutionRequest。我们暂时可以忽略解决方案请求。

以下是我的InstanceRequest处理程序

public class InstanceNameRequestProcessor {

private final Logger logger = LoggerFactory.getLogger(InstanceNameRequestProcessor.class);

public String prepareName(InstanceRequest request) {

        System.out.println(Thread.currentThread().getName()
                + " request name #" + request.getName() );
        logger.info(Thread.currentThread().getName()
                + " request name #" + request.getName() );
        return request.getDescription();

}
}  

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

}

现在,当我调用通过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 Integration中遗漏了某些内容,某些配置或一些已知的设计问题。

0 个答案:

没有答案