【问题标题】:Spring Integration Wiretap with Annotations (4.3 Spring Integration)Spring Integration Wiretap with Annotations (4.3 Spring Integration)
【发布时间】:2018-07-23 14:17:37
【问题描述】:

我有一个 Spring Integration (4.3) 应用程序和一个 JMS 接收器,它将接收到的消息发送到 ServiceActivator。

我正在尝试窃听一个频道,并将 JMS 消息发送到 Logger(在本例中也是 Service Activator)

下面的代码有一个奇怪的行为。

发送的每条奇数消息(第一条,第三条) - 它只会发送给记录器。

发送的每条偶数消息(第二条、第四条等) - 只发送到应该做一些工作并在未来将消息发送到下游的 ServiceActivator。

这里是日志

2018-07-23 16:14:43.278 INFO 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);
}

我想对此代码进行窃听记录

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    你的配置一团糟。

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

    您将TappingChannel 分开不会带来任何价值,而且它根本无法使用。没有人向此频道发送消息:您直接发送到listener.setRequestChannelName("myLogChannel");...因此,WireTap 根本不会执行。

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

    更新

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

    【讨论】:

    • 我想使用 Channel Wiretap 记录消息(并将原始消息发送到主通道)
    • 好的!你的main channel 是什么?您是否能够实现至少一个主要流程?让我们考虑稍后记录!您从 JMS 发送到 myLogChannel 的问题,并且您的两个服务都在监听这个频道。这很令人困惑......
    • 我已经使用工作主流程(没有记录)编辑了我的原始帖子。注意:我们使用的是 Spring Integration 4.3,所以我们不能使用 DSL
    • 您想窃听toRouter 频道吗?我们不会窃听代码。不是吗?为什么你不在一开始就显示一个工作代码并问一个问题如何继续?显示损坏的代码并期待合理的答案有什么意义?这是您的代码,如果您让我们感到困惑,我们真的很难理解您想要实现的目标。很抱歉语气这么粗鲁,不过这对连自己都不帮的人也很难帮到……
    • 是的,我想连接到 toRouter 通道。第一个代码对我有用——我没有得到正确的行为——所以这就是我问这个问题的原因。第一个和第二个示例对我来说是相同的,只有第二个包含其他频道名称并且没有日志记录。我在关注这个例子:github.com/spring-projects/spring-integration-java-dsl/issues/…(我可能搞砸了)
    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 2018-10-11
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多