带注释的Spring Integration窃听(4.3 Spring Integration)

时间:2018-07-23 14:17:38

标签: spring-integration

我有一个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);
}

我想在此代码上进行窃听记录

1 个答案:

答案 0 :(得分:1)

您的配置混乱。

首先,对于同一个@ServiceActivator myLogChannel,您有两个DirectChannel。 默认情况下,它使用循环调度策略。这就是为什么您在同一频道上看到两个消费者之间的奇/偶行为。

您将TappingChannel分开并没有带来任何价值,而且根本就没有用。没有人向该频道发送消息:尽管您直接向listener.setRequestChannelName("myLogChannel");发送消息,所以也根本没有执行WireTap

我不确定如何为您提供帮助,因为目前尚不清楚您将用作主要渠道以及应该从窃听中使用什么。

更新

因此,您需要在此new WireTap("myLogChannel")频道上配置toRouter