我有一个Spring Integration(4.3)应用程序,我有一个JMS接收器,它将接收到的消息发送到ServiceActivator。
我正在尝试窃听频道,并将JMS消息发送到Logger(在本例中也是Service Activator)
我在下面的代码中遇到了奇怪的行为。
发送的每条奇怪消息(第一,第三条)-仅发送到记录器。
每条发送的消息(第二,第四等)-仅发送给应该做一些工作的ServiceActivator,以后再将消息发送到下游。
这是日志
2018-07-23 16:14:43.278信息16532 --- [container-1] zzz:MSG1
通过barChannel接收:MSG2
如何更改我的代码,以便所有消息都发送到记录仪和应该执行此工作的ServiceActivator?
非常感谢
@Bean
public ConnectionFactory jmsConnectionFactory() {
return new ActiveMQConnectionFactory("tcp://localhost:61616");
}
@Bean
public JmsMessageDrivenEndpoint inbound() {
JmsMessageDrivenEndpoint jmsMessageDrivenEndpoint = new JmsMessageDrivenEndpoint(container(), listener());
jmsMessageDrivenEndpoint.setSessionAcknowledgeMode("transacted");
jmsMessageDrivenEndpoint.setAutoStartup(true);
return jmsMessageDrivenEndpoint;
}
@Bean
public DefaultMessageListenerContainer container() {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(jmsConnectionFactory());
container.setDestinationName("foo.bar");
return container;
}
@Bean
public ChannelPublishingJmsMessageListener listener() {
ChannelPublishingJmsMessageListener listener = new ChannelPublishingJmsMessageListener();
listener.setRequestChannelName("myLogChannel");
return listener;
}
@ServiceActivator(inputChannel = "myLogChannel")
public void bar(String in) {
System.out.println("Received via barChannel: " + in);
}
@Bean
public MessageChannel TappingChannel(MessageChannel myLogChannel) {
DirectChannel d = new DirectChannel();
d.addInterceptor(new WireTap("myLogChannel"));
return d;
}
@Bean
@ServiceActivator(inputChannel = "myLogChannel")
public MessageHandler logger() {
LoggingHandler loggingHandler = new LoggingHandler(LoggingHandler.Level.INFO.name());
loggingHandler.setLoggerName("zzz");
return loggingHandler;
}
@Bean
public MessageChannel myLogChannel() {
return new DirectChannel();
}
编辑:这是有效的原始代码
@Bean
public MessageChannel toRouter() {
return new DirectChannel();
}
@Bean
public ConnectionFactory jmsConnectionFactory() {
return new ActiveMQConnectionFactory("tcp://localhost:61616");
}
@Bean
public JmsMessageDrivenEndpoint inbound(ConnectionFactory jmsConnectionFactory) {
return new JmsMessageDrivenEndpoint(container(jmsConnectionFactory), listener());
}
@Bean
public DefaultMessageListenerContainer container(ConnectionFactory jmsConnectionFactory) {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(jmsConnectionFactory);
container.setDestinationName("foo.bar");
return container;
}
@Bean
public ChannelPublishingJmsMessageListener listener() {
ChannelPublishingJmsMessageListener listener = new ChannelPublishingJmsMessageListener();
listener.setRequestChannelName("toRouter");
return listener;
}
@ServiceActivator(inputChannel = "toRouter")
public void bar(String in) {
System.out.println("Received via barChannel: " + in);
}
我想在此代码上进行窃听记录
答案 0 :(得分:1)
您的配置混乱。
首先,对于同一个@ServiceActivator
myLogChannel
,您有两个DirectChannel
。
默认情况下,它使用循环调度策略。这就是为什么您在同一频道上看到两个消费者之间的奇/偶行为。
您将TappingChannel
分开并没有带来任何价值,而且根本就没有用。没有人向该频道发送消息:尽管您直接向listener.setRequestChannelName("myLogChannel");
发送消息,所以也根本没有执行WireTap
。
我不确定如何为您提供帮助,因为目前尚不清楚您将用作主要渠道以及应该从窃听中使用什么。
更新
因此,您需要在此new WireTap("myLogChannel")
频道上配置toRouter
。