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

Apache Camel Route中的动态to()

姜烨伟
2023-03-14

我正在使用Apache Camel编写一个演示程序。Out Camel route正在从Spring Boot计划程序调用,它将文件从源目录C:\CamelDemo\inputFolder传输到目标目录C:\CamelDemo\outputFolder

Spring Boot调度程序如下

@Component
public class Scheduler {

    @Autowired
    private ProducerTemplate producerTemplate;

    @Scheduled(cron = "#{@getCronValue}")
    public void scheduleJob() {
        System.out.println("Scheduler executing");
        String inputEndpoint = "file:C:\\CamelDemo\\inputFolder?noop=true&sendEmptyMessageWhenIdle=true";
        String outputEndpoint = "file:C:\\CamelDemo\\outputFolder?autoCreate=false";

        Map<String, Object> headerMap = new HashMap<String, Object>();
        headerMap.put("inputEndpoint", inputEndpoint);
        headerMap.put("outputEndpoint", outputEndpoint);

        producerTemplate.sendBodyAndHeaders("direct:transferFile", null, headerMap);
        System.out.println("Scheduler complete");
    }
}

阿帕奇骆驼路线如下

@Component
public class FileTransferRoute extends RouteBuilder {

    @Override
    public void configure() {
        errorHandler(defaultErrorHandler()
            .maximumRedeliveries(3)
            .redeliverDelay(1000)
            .retryAttemptedLogLevel(LoggingLevel.WARN));

        from("direct:transferFile")
            .log("Route reached")
            .log("Input Endpoint: ${in.headers.inputEndpoint}")
            .log("Output Endpoint: ${in.headers.outputEndpoint}")
            .pollEnrich().simple("${in.headers.inputEndpoint}")
            .recipientList(header("outputEndpoint"));
            //.to("file:C:\\CamelDemo\\outputFolder?autoCreate=false")
    }
}

当我注释掉recipientList()的行,并在to()中取消注释to()即givig静态endpoint时,流正在工作。但当我对()进行注释并取消对recipientList()的注释时,它不起作用。请帮助如何将消息路由到动态endpoint(OutpundPoint)?

共有1个答案

梁华皓
2023-03-14

您正在使用pollEnrich而没有指定聚合策略:在这种情况下,Camel将从检索到的资源创建一个新的OUT消息,而不将其与原始in消息组合:这意味着您将丢失先前在in消息上设置的头。

见文件:https://camel.apache.org/manual/latest/enrich-eip.html#_a_little_enrich_example_using_java

StratyRef指用于将来自外部服务的回复合并为单个传出消息的AggregationStrategy。默认情况下,Camel将使用来自外部服务的回复作为传出消息。

一个简单的解决方案是在pollEnrich组件上定义一个简单的AggregationStrategy,它只是将消息头从IN消息复制到新的OUT消息(注意,然后您将使用原始的IN消息体,但在您的情况下,我想这不是问题)

    from("direct:transferFile")
            .log("Route reached")
            .log("Input Endpoint: ${in.headers.inputEndpoint}")
            .log("Output Endpoint: ${in.headers.outputEndpoint}")
            .pollEnrich().simple("${in.headers.inputEndpoint}")
            .aggregationStrategy((oldExchange, newExchange) -> {
                // Copy all headers from IN message to the new OUT Message
                newExchange.getIn().getHeaders().putAll(oldExchange.getIn().getHeaders());
                return newExchange;
            })
            .log("Output Endpoint (after pollEnrich): ${in.headers.outputEndpoint}")
            .recipientList(header("outputEndpoint"));
            //.to("file:C:\\var\\CamelDemo\\outputFolder?autoCreate=false");

 类似资料:
  • 问题内容: 我想将css类动态添加到我要遍历的元素中。循环是这样的: 在我的待办事项模型中,我具有属性优先级,可以是“紧急”,“不太重要”或“正常”,我只想为每个元素分配类。 我知道我可以使用类似的布尔值来做到这一点, 但是我的变量不是布尔值,而是具有三个值。我该怎么做?另请注意,由于我的课程会改变一些视觉效果,因此我不想使用。 问题答案: 您可以简单地将一个函数指定为表达式,然后从那里返回适当的

  • 问题内容: 如何在LWUI中创建动态表 这是静态的。我想动态创建行数和列数..plz帮助 问题答案: 请参阅此示例代码。我已使用此代码使用LWUIT创建了动态表。

  • 我一直在玩动态LINQ,我想知道Java是否有可能做类似的事情。例如,如果我使用这个工作代码: 有没有一种方法可以让它像使用动态LINQ一样动态

  • 问题内容: 我目前正在为我的一个类进行分配,在其中,我必须使用Java语法给出 静态 和 动态绑定的 示例。 我了解基本概念,即静态绑定在编译时发生,而动态绑定在运行时发生,但是我无法弄清楚它们实际上是如何工作的。 我找到了一个在线静态绑定的示例,给出了以下示例: 并且这将显示“ animal is eating”,因为 对的调用使用了静态绑定,但是我不确定 为什么 将其视为静态绑定。 到目前为止

  • 请有人给我解释一下输出的最后6行是如何打印出来的。我知道,由于静态绑定,前三行打印适当。 我不知道为什么第5行给出了输出,因为它是Ipod类型的,它没有任何歌曲方法,但它仍然打印输出。代码如下: 输出如下所示: