【问题标题】:Apache Camel Resequence Program Not WorkingApache Camel Resequence 程序不工作
【发布时间】:2016-08-24 01:28:34
【问题描述】:

我正在尝试使用 Apache Camel 运行一个简单的重新排序程序。该程序使用 Java DSL 对传入的 Java 消息重新排序。当我运行这个程序时,消息被写入文件夹,但根据标题值或消息正文中单个单词的字母顺序,似乎没有任何特定的顺序。 Camel 创建的文件仍然是乱序的,就好像resequence DSL 函数什么也没做一样。

我怎样才能让这个程序像Arrays.sort() 方法那样实际订购消息?另外,我怎样才能让这个程序重新排序,然后以正确的排序顺序将消息聚合到一个文件中?

这是程序...我通过另一个具有main 方法的类调用主Camel 路由。

import org.apache.camel.builder.RouteBuilder;

public class SortThoseMessages extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        from("direct:pointA")
                .resequence(header("grocery"))

                .to("file:target/pointB");
    }

}

下面的类有main 并将消息生成到队列pointA 中。

import org.apache.camel.CamelContext;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.ProducerTemplate;

public class NewSequenceMain {

    public static void main(String[] args) { 
        CamelContext c = new DefaultCamelContext();

        try { 

         c.addRoutes(new SortThoseMessages());



        ProducerTemplate template = c.createProducerTemplate();

        c.start();

        template.sendBodyAndHeader("direct:pointA", "apple", "grocery", 1);
        template.sendBodyAndHeader("direct:pointA", "orange", "grocery", 3);
        template.sendBodyAndHeader("direct:pointA", "bannanna", "grocery", 2);

        Thread.sleep(5000);
        c.stop();

        } catch(Exception ex) { 
            System.err.println("Exception thrown -> " + ex);
            System.err.println("Now printing stacktrace...");
            ex.printStackTrace();
        }

    }

}

【问题讨论】:

  • “文件乱序”是什么意思?文件的时间戳是否不正确,所以很明显没有进行排序?也许您可以在 resequence() 之前和之后在根目录中添加一个记录器以查看消息的顺序。
  • 嗨@Frank,当我说它们出现故障时,我的意思是 Camel 创建的文件按照使用 ProducerTemplate 创建消息的顺序排列。文件以数字结尾——1 代表苹果消息,3 代表橙色消息,5 代表香蕉消息。正如您所描述的那样,有时使用记录器可能会有所帮助。谢谢你的帮助弗兰克。 :) 令人困惑...
  • @Frank 在Java DSL 中添加log 后,正如您所建议的,我看到可能根据标题中的面包屑,消息是按字母顺序排序或排序的。我将尝试通过将所有消息正文聚合到一个文件来测试它,以便排序更加明显。 :D
  • @Frank 我认为这很有效。如果我在对消息进行排序后聚合消息,我可以看到消息正文已按字母顺序或根据标头值排序。也许这已经完成了,但在写入文件时丢失了,就像我在上面的小程序中所做的那样。在写入文件之前聚合路由末尾的消息我认为表明消息毕竟是重新排序的。 :)
  • 关于文件命名:据我所知,输出文件是用消息 ID 命名的,消息在 进入路由时得到。在您的情况下,顺序错误。如果您不想汇总消息,可以更改输出的文件名:.to("file:target/pointB?fileName=${headers.grocery}");

标签: java apache-camel


【解决方案1】:

消息可能会在 Camel 路由内重新排序,但不会在写入文件时重新排序。要查看重新排序,请调用aggregator Java DSL 以按照指定的顺序查看消息正文。发布的程序中的消息按照标题的编号排序。 ProducerTemplate 对象引用上的方法调用将标头设置为sendBodyAndHeader() 方法调用的最后一个参数中的整数。

要查看重新排序在单个文件中作为骆驼路线的目的地生效,请查看以下示例:

import org.apache.camel.builder.RouteBuilder;


public class ReorganizingMessages extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        from("direct:pointA")
                .resequence(header("grocery"))
                .to("log://org.apache.camel.howto?showAll=true&multiline=true")

                .aggregate().constant(true).completionTimeout(100L).
                aggregationStrategy(new StringAggregator())
                .to("file:target/pointB");
    }

}

上面的代码使用了一个自定义聚合器 Java bean,如下所示。

import org.apache.camel.Exchange;
import org.apache.camel.processor.aggregate.AggregationStrategy;

public class StringAggregator implements AggregationStrategy {

    @Override
    public Exchange aggregate(Exchange old, Exchange new1) {
        if (old == null) { 
            return new1;
        }

        String oldBody = old.getIn().getBody(String.class);
        String newBody = new1.getIn().getBody(String.class);
        old.getIn().setBody(oldBody + " " + newBody);
        return old;

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多