在Spring中覆盖具有相同关联ID和序列号的消息

在Spring中覆盖具有相同关联ID和序列号的消息,spring,sequence,spring-integration,correlation,aggregator,Spring,Sequence,Spring Integration,Correlation,Aggregator,根据我自己的实验(在任何地方都找不到记录),如果有两条消息具有相同的关联ID和序列号,聚合器将只接收第一条消息并丢弃/忽略另一条消息 有没有办法让聚合器使用最后收到的消息 聚合将有效负载合并为1个字符串 简单场景: 3条具有相同关联ID且序列大小为2的消息,按接收时间排序 顺序#:1;有效载荷:abc 顺序#:1;有效载荷:def 顺序#:2;有效载荷:ghi 电流输出:abcghi 预期产出:defghi 这种情况发生在序列#2缺失时,即第1条消息缺失时。并且相关ID(从解码的有效载荷获得

根据我自己的实验(在任何地方都找不到记录),如果有两条消息具有相同的关联ID和序列号,聚合器将只接收第一条消息并丢弃/忽略另一条消息

有没有办法让聚合器使用最后收到的消息

聚合将有效负载合并为1个字符串

简单场景: 3条具有相同关联ID且序列大小为2的消息,按接收时间排序

  • 顺序#:1;有效载荷:abc
  • 顺序#:1;有效载荷:def
  • 顺序#:2;有效载荷:ghi
电流输出:abcghi

预期产出:defghi

这种情况发生在序列#2缺失时,即第1条消息缺失时。并且相关ID(从解码的有效载荷获得)非常有限,因此它将被多次使用

原始消息

原始消息的格式如下:

  • “序列大小”、“序列号”、“ID”、“文本”
  • ID范围在0-9之间
  • 示例消息:2,1,8,abc
原始消息有效负载示例:

  • 2,1,8,abc
  • 2,1,8,def
  • 2,2,8,ghi

聚合器基本上结合了文本

您需要使用自定义发布策略(它可以具有与默认的
SequenceSizeReleaseStrategy
相同的逻辑,但不能是该类)。使用默认策略,将跳过重复序列

但是,您还需要一个自定义消息组存储来执行所需的行为;否则,输出将为
abcdefghi

但是,在这种情况下,丢弃的消息将不会发送到丢弃通道

重用相关id通常不是一个好主意;如果必须,则在重新使用相关id之前,使用
组超时
或收割器丢弃部分组


顺便说一句,您可能会发现使用自定义的
CorrelationsStrategy
ReleaseStrategy
比使用默认值和操纵标题更容易。

谢谢gary!正如所建议的,我目前正在研究如何定制(使用非默认设置),主要是覆盖具有相同序列的消息。仅供参考,是的,我的案例必须重用correlationId,因为它是从消息的有效负载派生的,我无法操纵它。我使用了组超时,但它的行为与我预期的不同。你可以在这里参考我的另一个问题:将很快更新。如果我在这里错了,请纠正我,correlatestrategy只是告诉哪个消息属于哪个组,releasestragy是告诉分组消息何时可以进入下一个路径。我的重点应该放在自定义消息组上,以便消息具有相同的seq。编号将覆盖旧编号。我错了吗?你有一个示例自定义消息组存储吗?ok发现了这个问题:正如我所说的,暂停旧组或提出更好的关联策略比试图在消息存储中操纵一个不完整的组要好得多。