这是用户在 2024-3-28 21:48 为 https://camel.apache.org/manual/processor.html 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?

 处理器


处理器接口用于实现消息交换的消费者或实现消息转换器以及其他用例。


在路线中使用处理器


一旦你编写了这样一个实现处理器的类:

public class MyProcessor implements Processor {

    public void process(Exchange exchange) throws Exception {
        // do something...
    }

}


然后,您就可以轻松地从 Java 中调用该处理器,例如

from("activemq:myQueue").process(new MyProcessor());


请注意,路由中的处理器是以类类型 MyProcessor.class 来表示的。在启动过程中,Camel 会使用 Injector 自动创建一个新的处理器实例,以便在路由消息时使用。


但是,在 XML DSL 中, <process > 标记要求引用现有的处理器实例,这一点可以做到:


然后,通过在 Spring 中声明 bean(比如通过 XML),就可以在路由中轻松使用它:

<bean id="myProcessor" class="com.acme.MyProcessor"/>


然后在 Camel 路由中使用 bean id:

<route>
  <from uri="activemq:myQueue"/>
  <process ref="myProcessor"/>
</route>


而在 Java DSL 中:

from("activemq:myQueue").process("myProcessor");


使用 #class 语法指代 Bean


在 XML DSL 中,您还可以使用 #class: 作为前缀,通过类名来引用处理器,如图所示:

<route>
  <from uri="activemq:myQueue"/>
  <process ref="#class:com.acme.MyProcessor"/>
</route>


这也适用于 Java DSL:

from("activemq:myQueue").process("#class:com.acme.MyProcessor");

有关 #class: 前缀(及其他)的详细信息,请参阅属性绑定。


不过,在 Java DSL 中,您通常会使用类型安全的方法,如前所述直接实例化处理器:

from("activemq:myQueue").process(new MyProcessor());


既然可以用 "到",为什么还要用 "过程 "呢?


进程可以作为匿名内部类在路由中使用,例如

    from("activemq:myQueue").process(new Processor() {
        public void process(Exchange exchange) throws Exception {
            String payload = exchange.getIn().getBody(String.class);
            // do something with the payload and/or exchange here
           exchange.getIn().setBody("Changed body");
       }
    }).to("activemq:myOtherQueue");


这可以用来快速编写代码。当然,如果内部类中的代码变得更加复杂,建议将其重构为一个单独的类。如果不想再次使用该处理器,最好采用这种方法。从可重用性的角度来看,不建议将这种方法用于匿名内部类。

 另见


  • 消费者模板:学习如何消费数据(包括处理器内的数据)


  • 生产者模板:学习如何生产数据(包括在处理器内生产数据)