架构

POJO 生产

师成师成· 更新于 2026-09-28· 阅读 6 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

POJO 生产者

从 POJO 向任意 Camel 端点发送消息有两种不同的方式:

  • 使用 @Produce 或 @EndpointInject
  • 通过接口封装

使用 @Produce

要允许从 POJO 发送消息,可以使用 @Produce 注解。它会注入一个 org.apache.camel.ProducerTemplate,从而使 bean 能够发送消息。

@Produce POJO 注解不属于任何 Camel 路由的一部分,因此不能对其使用 errorHandler 或 onException。

例如,向 ActiveMQ 上的 foo 队列发送一条消息:

public class Foo {

  @Produce("activemq:foo")
  ProducerTemplate producer;

  public void doSomething() {
    if (whatever) {
      producer.sendBody("<hello>world!</hello>");
    }
  }
}

这样做的缺点是你的代码现在依赖于 Camel 的 API ProducerTemplate。下一节介绍如何消除这种依赖。

关于如何在 bean 上使用属性作为端点配置,例如在 @Produce 或 @EndpointInject 上使用 property 属性,请参阅 POJO Consuming。

对你的代码隐藏 Camel API

你可以对应用代码隐藏 Camel API。你可以在一个注入点(字段或属性 setter)上添加 @Produce 注解,并使用你在业务逻辑中使用的某个接口。示例:

public interface MyListener {

    // this method is request/reply (InOut) because the method has a return value
    // to use one way (InOnly) then the method should be a void method
    String sayHello(String name);
}

public class MyBean {
    @Produce("activemq:foo")
    protected MyListener producer;

    public void doSomething() {
        // lets send a message and get a response back
        String response = producer.sayHello("James");
    }
}

在此处,Camel 会在 @Produce 注解处自动注入一个智能客户端代理——即 MyListener 接口的一个实例。

当我们调用该接口上的方法时,方法调用会被转换为一个对象并发送到端点;在本例中,就是发送到 ActiveMQ 端点的 foo 队列。由于 sayHello 方法具有返回类型(String),Camel 将使用请求-应答(InOut)消息模式。

如果方法是 void 方法,那么 Camel 将使用事件消息(InOnly)消息模式,如下所示:

public interface MyListener {

    // this method is one-way (InOnly) because the method is void
    void sayHello(String name);

}

另请参阅

评论

登录后参与评论

正在加载评论…