【问题标题】:Apache Camel single route to get message from multiple sourceApache Camel 单一路由从多个来源获取消息
【发布时间】:2015-09-09 17:09:29
【问题描述】:

我需要编写一个 Apache Camel 路由到

  1. 从 Active-MQ JMS-Queue 接收消息(包含文件位置)。
  2. 使用来自 JMS-Queue 的接收消息中的位置读取文件内容。
  3. 将该文件内容发送到另一个 Active-MQ JMS-Queue。

我可以编写两条单独的路线 1) 从 Active-MQ 获取消息和 2) 使用静态文件名从文件夹中的文件读取并发送到 JMS 队列。 但我的要求是只从那些文件中读取内容,我从 JMS 队列中获取详细信息。意味着从文件中读取内容是有选择性的并且基于条件。

以下是我需要的示例 Java DSL 路由配置。

from("activemq:queue:filelocationQueue")
 .from("file://<<File-Location from JMS-Queue>>?noop=true")
   .convertBodyTo(String.class)
      .to("activemq:queue:fileContent");

我知道不可能在一条路线中使用两个“来自”。但是如何使用 Apache Camel 来实现这种逻辑呢?

请各位大佬给点解决方案,我也准备用两条Camel路由来实现这个逻辑。

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

    您可以在处理器中使用 Camel 的 ConsumerTemplate 来获得您需要的内容,如下所示:

        from("activemq:queue:filelocationQueue")
        .process(new Processor() {
    
            public void process(Exchange exchange) throws Exception {
    
                // "file://<<File-Location from JMS-Queue>>?noop=true"
                String fileLocation = exchange.getIn().getBody(String.class);
    
                ConsumerTemplate template = getContext().createConsumerTemplate();
                // This is like your second "from". Use 2 second timeout (2000 ms).
                Exchange fileExchange = template.receive(fileLocation,2000);
                exchange.getOut().setBody(fileExchange.getIn().getBody());
                template.doneUoW(fileExchange);
            }
        })
        .convertBodyTo(String.class, "UTF-8")
        .to("activemq:queue:fileContent");
    

    以上假设从 filelocationQueue 接收到的消息正文包含要使用的文件的确切路径,例如file:/home/user/input?noop=true&fileName=file.txt。请注意,您可以only 使用一个文件的唯一方法是使用 fileName URI 选项。否则,您将使用该文件夹中的所有文件。

    【讨论】:

    • 是的,只要稍作改动,它对我来说就可以了。我能够使用来自 JMS-Queue 的消息动态定义新端点。感谢您的帮助。
    【解决方案2】:

    您可以使用 Content Enricher EIP 及其 pollEnrich 方法:

    from("direct:start")
      .pollEnrich("file:inbox?fileName=data.txt")
      .to("direct:result");
    

    pollEnrich 的 URI 是使用当前 Exchange 中的值动态计算的。

    【讨论】:

    • 我试过了,这是一个不错的选择。但在这种情况下,我无法使用接收到的绝对文件路径动态提供“父文件夹”。看起来需要对父文件夹进行硬编码,例如在您的情况下它是“收件箱”。只有 fileName 是动态的,可以在运行时动态生成和提供。谢谢你帮助我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    相关资源
    最近更新 更多