POJO 消费
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 方法。
- 如果显式指定了属性名称,则使用该属性名称。
- 如果未配置属性名称,则使用方法名。
- 尝试获取名为 Endpoint 的属性(即以后缀 Endpoint 结尾)。
- 尝试按原样获取同名属性(即不添加前缀或后缀)。
- 如果属性名称以 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 将使用该方法。
另请参阅
评论
登录后参与评论
KnowForge