我认为这是一个相当常见的用例,但我在Camel文档中没有看到任何内容。我查看了重新定序器,但这似乎不合适。
最适合使用的技术是什么?
我显然需要跟踪最后处理的/下一个预期的序列号。你将如何做到这一点,以便可以停止路线等,并保持对所期望的序列的了解?
提前致谢。
答案 0 :(得分:1)
您可以使用重定序器(加上处理器)来执行此操作。
首先,要记住一些事情:从camel 2.11开始,重定序器可以配置为拒绝“旧”消息,但它不会(据我所知)检测到“跳过”消息(例如消息2) ,3,5 - 跳过4),因此您需要通过自定义处理器为此添加额外的检查。
from("direct:myFiles")
.bean(SetSequenceNumber.class) // set header "seqnum" of type Long
.resequence(header("seqnum")).stream().timeout(5000).rejectOld()
.process(new Processor() {
Long lastSeq;
@Override
public void process(Exchange exchange) throws Exception {
Long seqnum = exchange.getIn().getHeader("seqnum", Long.class);
if (lastSeq == null) {
lastSeq = seqnum;
} else {
if (seqnum != lastSeq + 1) {
throw new IllegalStateException("Skipped sequence number between " + lastSeq + " and " + seqnum);
}
lastSeq = seqnum;
}
}
})
.log("Resequenced: ${header.seqnum}")
;
基本上,您可以从文件名中提取序列号,并将其设置为名为seqnum
的标题。然后通过重定序器发送它,指定超时。然后它通过你的处理器检测跳过的序列号。
我希望这会有所帮助。