6.3. CDI 和 Camel Bean 组件
6.3.1. 按名称引用 bean 复制链接链接已复制到粘贴板!
要按名称引用路由定义中的 bean,只需为 bean 标注 @Named ("myNamedBean") 和 @ApplicationScoped (或其他 支持的范围 )。@RegisterForReflection 注释对原生模式非常重要。
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Named;
import io.quarkus.runtime.annotations.RegisterForReflection;
@ApplicationScoped
@Named("myNamedBean")
@RegisterForReflection
public class NamedBean {
public String hello(String name) {
return "Hello " + name + " from the NamedBean";
}
}
然后您可以在路由定义中使用 myNamedBean 名称:
import org.apache.camel.builder.RouteBuilder;
public class CamelRoute extends RouteBuilder {
@Override
public void configure() {
from("direct:named")
.bean("myNamedBean", "hello");
/* ... which is an equivalent of the following: */
from("direct:named")
.to("bean:myNamedBean?method=hello");
}
}
作为 @Named 的替代选择,您也可以使用 io.smallrye.common.annotation.Identifier 来命名和识别 bean。
import jakarta.enterprise.context.ApplicationScoped;
import io.quarkus.runtime.annotations.RegisterForReflection;
import io.smallrye.common.annotation.Identifier;
@ApplicationScoped
@Identifier("myBeanIdentifier")
@RegisterForReflection
public class MyBean {
public String hello(String name) {
return "Hello " + name + " from MyBean";
}
}
然后引用 Camel 路由中的标识符值:
import org.apache.camel.builder.RouteBuilder;
public class CamelRoute extends RouteBuilder {
@Override
public void configure() {
from("direct:start")
.bean("myBeanIdentifier", "Camel");
}
}
6.3.2. @consume 复制链接链接已复制到粘贴板!
自 Camel Quarkus 2.0.0 起,camel-quarkus-bean 工件提供对 @org.apache.camel.Consume - 的支持,请参阅 Camel 文档的 Pojo 消耗 部分。
声明类,如下所示
import org.apache.camel.Consume;
public class Foo {
@Consume("activemq:cheese")
public void onCheese(String name) {
...
}
}
将自动创建以下 Camel 路由
from("activemq:cheese").bean("foo1234", "onCheese")
为您提供.请注意,Camel Quarkus 将隐式将 @jakarta.inject.Singleton 和 jakarta.inject.Named ("foo1234") 添加到 bean 类,其中 1234 是一个从完全限定类名称获取的哈希值代码。如果您的 bean 设置了一些 CDI 范围(如 @ApplicationScoped)或 @Named ("someName"),则这些范围将在自动创建的路由中进行。