提问者:小点点

Spring集成消息通道跳过消息


我有以下配置,它使用Redis作为消息存储。我没有这个模块的java代码,只有这个配置文件。这个配置有以下功能:当这个模块从输入通道接收到消息时,它会检查Redis存储,如果消息不存在(表达式将被评估为TRUE),消息将被发送到输出通道,输出通道将被放入Redis;如果消息已经存在(表达式被评估为False),消息将被丢弃。

假设这个模块称为RedisModule,所以我有一个流:

 RedisMdule | log

问题是:当我向这个模块发送消息时,在日志文件中,它显示了消息#2、#4、#6等,第一条消息丢失了,奇数消息也丢失了。这个配置文件中有什么我遗漏的吗?非常感谢。

  <int:channel id="input"/>
  <int:channel id="output"/>

  <int:filter input-channel="input"
              output-channel="output"
              discard-channel="nullChannel"
              expression="@metadataStore.get(payload) == null"/>

  <int:outbound-channel-adapter channel="output"
                              expression="@metadataStore.put(payload, '')"/>

共1个答案

匿名用户

从大的高度来看,您似乎需要幂等接收器,它执行完全相似的逻辑,但以原子方式。请参阅MetadataStoreSelector源代码:

    return this.metadataStore.putIfAbsent(key, value) == null;

因此,您可以配置

您的帖子不清楚您是如何获取日志的,因为

也许您在SpringXD中?您使用输出通道来实现自己的目的,但这实际上应该是您模块的输出。

这可能是您只看到偶数消息的原因,因为奇数被发送到您的

使用<代码>