第5章 Camel Quarkus のコンテキストと依存性注入 (CDI)
CDI は Quarkus で中心的な役割を果たしています。また、Camel Quarkus も CDI に対して優れたサポートを提供します。
たとえば、@Inject
、@ConfigProperty
、および同様のアノテーションを使用して、Bean と設定値を Camel RouteBuilder
に注入することができます。以下に例を示します。
import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.apache.camel.builder.RouteBuilder; import org.eclipse.microprofile.config.inject.ConfigProperty; @ApplicationScoped 1 public class TimerRoute extends RouteBuilder { @ConfigProperty(name = "timer.period", defaultValue = "1000") 2 String period; @Inject Counter counter; @Override public void configure() throws Exception { fromF("timer:foo?period=%s", period) .setBody(exchange -> "Incremented the counter: " + counter.increment()) .to("log:cdi-example?showExchangePattern=false&showBodyType=false"); } }
- 1
@ApplicationScoped
アノテーションは@Inject
および@ConfigProperty
がRouteBuilder
で機能するために必要です。@ApplicationScoped
Bean は、CDI コンテナーによって管理され、そのライフサイクルは単純なRouteBuilder
のライフサイクルよりも複雑です。つまり、RouteBuilder
で@ApplicationScoped
を使用すると、ブート時にデメリットが生じることがあるため、本当に必要なときにのみRouteBuilder
に@ApplicationScoped
のアノテーションを付ける必要があります。- 2
timer.period
プロパティーの値は、サンプルプロジェクトのsrc/main/resources/application.properties
で定義されています。
ヒント
詳細は、Quarkus Dependency Injection guide を参照してください。
5.1. CamelContext
へのアクセス
CamelContext
にアクセスするには、CamelContext を Bean に注入します。
import jakarta.inject.Inject; import jakarta.enterprise.context.ApplicationScoped; import java.util.stream.Collectors; import java.util.List; import org.apache.camel.CamelContext; @ApplicationScoped public class MyBean { @Inject CamelContext context; public List<String> listRouteIds() { return context.getRoutes().stream().map(Route::getId).sorted().collect(Collectors.toList()); } }