架构

POJO 消费

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

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

POJO 消费

要消费消息,你可以使用 @Consume 注解来将某个 bean 的特定方法标记为消费者方法。该注解的值定义了要从中消费消息的 Camel Endpoint。

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

例如,我们可以使用来自 ActiveMQ 中 cheese 队列的入站 JMS 消息的字符串主体来调用 onCheese() 方法;这里会使用 类型转换器,按照方法签名中的声明将 JMS 负载转换为 String。

仅 Java:使用 @Consume 注解消费消息

public class Foo {

  @Consume("activemq:cheese")
  public void onCheese(String name) {
    // do something here
  }
}

Bean 绑定随后用于将传入的消息转换为调用该方法所使用的参数列表。

这基本上会创建一条大致如下的路由(基于上面的示例):

纯 Java:@Consume 注解创建的等效路由

from("activemq:cheese").bean(Foo.class, "onCheese");

使用属性来定义端点

以下注解 @Consume、@Produce、@EndpointInject 都提供了一个 property 属性,你可以用它把端点 URI 定义为 Bean 上的一个属性。随后 Camel 会通过 getter 方法来访问该属性。

例如:

仅使用 Java:使用属性来定义 @Consume 端点

public class MyService {

  private String serviceEndpoint;

  public void setServiceEndpoint(String uri) {
     this.serviceEndpoint = uri;
  }

  public String getServiceEndpoint() { (2)
     return serviceEndpoint;
  }

  @Consume(property = "serviceEndpoint") (1)
  public void onService(String input) {
     // do something
  }
}
1该属性的 getter 方法
2指向该属性的名称

Bean MyService 有一个名为 serviceEndpoint 的属性,并且该属性有对应的 getter/setter 方法。现在我们想要将该 Bean 用于 POJO Consuming,因此我们在 onService 方法中使用了 @Consume 注解。注意我们如何使用 property = "serviceEndpoint" 来配置包含端点 URL 的属性。

  • Spring XML
  • YAML

如果你在 Spring XML 中定义 Bean,则可以按如下方式配置该属性:

<bean id="myService" class="com.foo.MyService">
  <property name="serviceEndpoint" value="activemq:queue:foo"/>
</bean>
- beans:
    - name: foo
      type: com.foo.MyService
      properties:
        serviceEndpoint: activemq:queue:foo

这允许你以任意依赖注入风格配置该 Bean。

使用属性命名约定的高级用法

Camel 提供了一种命名约定,使你无需显式指定属性名称。Camel 使用以下算法来查找 getter 方法,该方法必须是一个 getXXX 方法。

  1. 如果显式指定了属性名称,则使用该属性名称。
  2. 如果未配置属性名称,则使用方法名。
  3. 尝试获取名为 Endpoint 的属性(即以后缀 Endpoint 结尾)。
  4. 尝试按原样获取同名属性(即不添加前缀或后缀)。
  5. 如果属性名称以 on 开头,则省略该前缀,重新执行第 3 步和第 4 步。

因此,在上面的示例中,@Consume 注解可以这样定义:

仅使用 Java:在 @Consume 中使用简写属性名

  @Consume(property = "service")
  public void onService(String input) {

现在该属性名为 service,这会匹配算法中的第 3 步,从而让 Camel 调用 getServiceEndpoint 方法。

我们也可以省略 property 属性,让其隐式解析:

纯 Java 方式:使用 @Consume 进行隐式属性解析

  @Consume
  public void onService(String input) {

现在 Camel 匹配第 5 步,去掉名称中的 on 前缀,并查找 service 作为属性名。由于存在 getServiceEndpoint 方法,Camel 将使用该方法。

另请参阅

评论

登录后参与评论

正在加载评论…