首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >骆驼文件序列号

骆驼文件序列号
EN

Stack Overflow用户
提问于 2014-03-05 01:31:27
回答 1查看 1.1K关注 0票数 2

我本以为这是一个相当常见的用例,但我没有在Camel文档中看到任何东西。我看了重新排序器,但这似乎不合适。

  1. 我有一条从第三方接收文件的路线。文件名包含序列号。文件必须按顺序处理。不能跳过序列号。
  2. 如果收到的文件大于预期的序列,那么我想跳过它,等待正确的序列号。然后,在接收到预期的序列号后,可以重新处理。
  3. 如果接收到的文件小于预期的序列,那么这将是一个错误。

最好的方法是什么?

显然,我需要跟踪最后处理的/下一个预期的序列号。你如何做到这一点,以使路线可以停止等,并保持知识的顺序期待?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-06 10:01:24

您可以使用重新排序器(加上处理器)来完成此操作。

首先,要记住一些事情:从camel 2.11,重新排序器可以配置为拒绝“旧”消息,但它不会(据我所见)检测“跳过”消息(例如,消息2、3、5-跳过4),因此您需要通过自定义处理器为此添加额外的检查。

代码语言:javascript
复制
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的标题。然后通过重新排序器发送它,指定超时。然后通过处理器检测跳过的序列号。

我希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22186741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档