Spring集成消息通道跳过消息

时间:2016-01-13 21:12:32

标签: spring-integration

我有以下配置,它使用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 个答案:

答案 0 :(得分:2)

从高处开始看起来你需要Idempotent Receiver,它具有完全相似的逻辑,但是采用原子方式。请参阅MetadataStoreSelector源代码:

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

因此,您可以使用<idempotent-receiver>配置RedisMetadataStore,并使用payload作为key-expression选项。

您的帖子并不清楚如何获取日志,因为<int:outbound-channel-adapter>单向组件。

也许你参加Spring XD?您出于自己的目的使用output频道的地方,但这应该是您模块的输出。

这可能是您只看到偶数消息的原因,因为奇数会发送到您的<int:outbound-channel-adapter>和{{1}默认情况下使用DirectChannel平衡策略。

使用round-robin,您的<idempotent-receiver>应该只有<bridge input-channel="input" output-channel="output"/>