java - Camel 文件序列号

标签 java apache-camel

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

  1. 我有一个从第 3 方接收文件的路径。文件名包含序列号。文件必须按顺序处理。不能跳过任何序列号。
  2. 如果收到的文件 > 比预期的序列号大,那么我想跳过它并等待正确的序列号。然后可以在收到预期的序列号后对其进行重新处理。
  3. 如果接收到的文件 < 不是预期的序列,那么这将是一个错误。

用于此的最佳技术是什么?

我显然需要跟踪上次处理的/下一个预期的序列号。您将如何做到这一点,以便可以停止路线等,并保留对预期顺序的了解?

提前致谢。

最佳答案

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

首先,要记住一些事情:从 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 的 header 。然后你通过重新排序器发送它,指定一个超时。然后它通过您的处理器检测到跳过的序列号。

希望对您有所帮助。

关于java - Camel 文件序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22186741/

相关文章:

java - 如何使用Apache Kafka实现 "Exactly once"kafka消费者?

java - 如何解决 Apache Camel 中的 "Failed to create route route1 exception"?

java - java中引用对象是如何工作的

java - 电话调用编程逻辑

java - 使用 Apache Camel Blueprint - 需要在容器内和独立状态下保留属性

java - 在 pollEnrich 结束策略之前删除文件

java - 等待依赖项 [(&(component=Simple)(objectClass=org.apache.camel.spi.ComponentResolver))]

java - 周期性任务取消和完成时的回调

java - Struts2:比较 If 标记中的 2 个变量不起作用

java - 如何在Java类文档中自动添加 "Last Edited"? (在 eclipse 中?)