我是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中遗漏了某些内容,某些配置或一些已知的设计问题。