覆盖 Spring 中具有相同关联 ID 和序列号的消息
Overwriting Messages with Same Correlation ID and Sequence Number in Spring
根据我自己的实验(无法在任何地方找到此记录),如果 2 条消息具有相同的相关 ID 和序列号,聚合器将只接收第一条消息,discard/ignore 另一条消息。
有没有办法让聚合器使用收到的最后一条消息?
聚合会将负载合并为 1 个字符串。
简单场景:
3 条具有相同相关 ID 且序列大小为 2 的消息,按接收时间排序
- 序列#:1;负载:abc
- 序列#:1;有效负载:def
- 序列#:2;负载:ghi
当前输出:abcghi
预期输出:defghi
当缺少用于第一条消息的序列#2 时会发生这种情况。并且相关ID(从解码的payload中获得)非常有限,因此会被多次使用。
原始消息
原始消息采用以下格式:
- "Sequence Size","Sequence Number","ID","Text"
- ID 介于 0-9 之间
- 示例消息:2,1,8,abc
示例原始消息负载:
- 2,1,8,abc
- 2,1,8,def
- 2,2,8,ghi
聚合器基本上结合了文本
你需要使用自定义的发布策略(可以和默认的SequenceSizeReleaseStrategy
逻辑相同,但不能是class)。使用默认策略会跳过重复序列。
但是,您还需要一个自定义消息组存储来实现您想要的行为;否则输出将是 abcdefghi
.
但是在这种情况下,丢弃的消息不会被发送到丢弃通道。
重复使用关联 ID 通常不是一个好主意;如果必须,请使用 group-timeout
或收割机在任何可能重用相关 ID 之前丢弃部分组。
顺便说一句,您可能会发现使用自定义 CorrelationStrategy
和 ReleaseStrategy
比使用默认值和操纵 headers.
更容易
根据我自己的实验(无法在任何地方找到此记录),如果 2 条消息具有相同的相关 ID 和序列号,聚合器将只接收第一条消息,discard/ignore 另一条消息。
有没有办法让聚合器使用收到的最后一条消息?
聚合会将负载合并为 1 个字符串。
简单场景: 3 条具有相同相关 ID 且序列大小为 2 的消息,按接收时间排序
- 序列#:1;负载:abc
- 序列#:1;有效负载:def
- 序列#:2;负载:ghi
当前输出:abcghi
预期输出:defghi
当缺少用于第一条消息的序列#2 时会发生这种情况。并且相关ID(从解码的payload中获得)非常有限,因此会被多次使用。
原始消息
原始消息采用以下格式:
- "Sequence Size","Sequence Number","ID","Text"
- ID 介于 0-9 之间
- 示例消息:2,1,8,abc
示例原始消息负载:
- 2,1,8,abc
- 2,1,8,def
- 2,2,8,ghi
聚合器基本上结合了文本
你需要使用自定义的发布策略(可以和默认的SequenceSizeReleaseStrategy
逻辑相同,但不能是class)。使用默认策略会跳过重复序列。
但是,您还需要一个自定义消息组存储来实现您想要的行为;否则输出将是 abcdefghi
.
但是在这种情况下,丢弃的消息不会被发送到丢弃通道。
重复使用关联 ID 通常不是一个好主意;如果必须,请使用 group-timeout
或收割机在任何可能重用相关 ID 之前丢弃部分组。
顺便说一句,您可能会发现使用自定义 CorrelationStrategy
和 ReleaseStrategy
比使用默认值和操纵 headers.