当前位置: 首页 > 知识库问答 >
问题:

Apache Camel重新排序程序不工作

孟自强
2023-03-14

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

如何让这个程序像Arrays.sort()方法那样对消息进行实际排序?此外,如何让这个程序重新排序,然后以正确的排序顺序将消息聚合到一个文件中?

这是节目。。。我通过另一个具有main方法的类调用主Camel route。

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();
        }

    }

}

共有1个答案

邢修明
2023-03-14

消息可能会在驼峰路径内重新排序,但在写入文件时不会。要查看重新排序,请调用聚合器JavaDSL,以按指定的顺序查看消息正文。程序中发布的消息是根据标题的编号排序的。ProducerTemplate对象引用上的方法调用将头设置为sendboyandheader()方法调用的最后一个参数中的整数。

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

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");
    }

}

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

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;

    }

}

 类似资料:
  • 寻找有关以下用例的建议或解决方案 应用程序接收按功能键(如员工id)标识的更改时间排序的消息。功能键可以有多条消息 每条消息都会触发一个工作流。如果员工有待定工作流,则希望将新消息排队,直到待定工作流完成 是否有任何方法可以在节奏中对消息重新排序,以将它们作为由消息中的功能键标识的组进行处理?

  • 问题内容: 出于明显的原因,下面的代码(Java Concurrency in Practice清单16.3)不是线程安全的: 但是,在几页之后的16.3节中,它们指出: 如果 是不变的,则实际上是安全的。 我不明白那句话: 如果是不可变的,则任何观察该变量的线程都将看到该变量为null或已完全构建(由于Java内存模型提供了对最终字段的有力保证) 然而,没有什么能够阻止指令重新排序:在特定的两次

  • 问题内容: 如何在不更改HTML源代码的情况下重新排序div? 例如,我希望div以#div2,#div1,#div3的顺序显示,但是在HTML中它们是: 谢谢! 问题答案: 没有使用css对元素进行重新排序的万能方法。 您可以通过将它们全部向右浮动来水平反转它们的顺序。或者,您可以将它们相对于正文或其他包含元素的绝对位置进行定位- 但这对元素的大小以及相对于页面上其他元素的位置存在严格的限制。

  • 问题内容: 我已经阅读了很多有关Java同步以及可能发生的所有问题的文章。但是,我仍然有些困惑的是JIT如何重新排序写入。 例如,简单的双重检查锁对我来说很有意义: 我们在第1行使用volatile来强制发生事前关系。没有它,JIT完全有可能整理我们的代码。例如: 线程1位于第6行,并且已分配内存,但是构造函数尚未运行,因为JIT可能会重新排序我们的代码。 线程2进入第2行,并获取一个尚未完全创建

  • 我试图在Docker中使用Create React App和Node js设置一个开发环境。但当我更改代码时,它不会重新加载更改 通常只使用卷就足够了,但我还添加了:CHOKIDAR\u USEPOLLING=true in ENV,正如create react app官方文档所说,我将代码移到了WSL,因为我在Windows 10上,但仍然是一样的。我用create react app创建了另一

  • 问题内容: 我有一张像下面的桌子, 我想使用“名称”列按字母顺序重新排序,并使用此新顺序重置ID(自动递增),以得到以下结果 问题 :如何使用MYSQL执行此操作? 问题答案: 请问您为什么要这么做? 如果有人修改了任何名称值或插入了新行,则会使您的订购方案混乱。试图以表的其他位置(名称列)已经可用的PK顺序存储一些含义似乎是多余的,因此是个坏主意。 更好的解决方案是不用担心ID列的值,而在应用程