5.3. CDI および Camel Bean コンポーネント
5.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"); } }
Red Hat は、Camel ドキュメントの Bean Binding セクションにリストされているすべてのユースケースをサポートすることを目指しています。機能しない Bean バインディングシナリオがある場合は、問題の報告 をぜひお願いいたします。
5.3.2. @Consume
Camel Quarkus 2.0.0 以降、camel-quarkus-bean
アーティファクトにより @org.apache.camel.Consume
がサポートされるようになりました。Camel ドキュメントの Pojo Consuming セクションを参照してください。
次のようなクラスを宣言します。
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")
がすでに設定されている場合、それらは自動作成されたルートで使用されます。