メッセージヘッダーまたは本文のアトリビュートに応じて、実行時に動的に決定されるプロセッサ経由でメッセージをルーティングするソリューションを見つけることに取り組んでいます。メッセージ本体またはヘッダーのプロパティに応じてCamelプロセッサを動的に読み込みます。
以下のように2つのメッセージプロセッサ(たとえば、Type1RequestProcessor
,Type2RequestProcessor
)があるとします。
私は実行されて何をしたいのいずれかType1RequestProcessor
またはType2RequestProcesso
rは、動的にメッセージヘッダOT体にプロパティを使用して決定しました。(ここで私はプロセッサの種類ごとに複数のルータを作成する必要はありません。)
私が試しました(ヘッダーにtypeIdを渡します)。しかし、それは明らかに以下のエラーをNo bean could be found in the registry for: ${header.messageId}RequestProcessor of type: org.apache.camel.Processor
と言っています。
HTTPRouter.java
import javax.enterprise.context.ApplicationScoped;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.cdi.ContextName;
@ApplicationScoped
@ContextName("camel-cdi-context")
public class HTTPRouter extends RouteBuilder {
@Override
public void configure() throws Exception {
from("direct:oneRouter")
.process("${header.typeId}RequestProcessor")
.to("direct:anotherRouter");
}
}
エラー:
org.apache.camel.FailedToCreateRouteException: Failed to create route route19 at: >>> process[ref:${header.messageId}RequestProcessor] <<< in route: Route(route19)[[From[direct:oneRouter]] -> [process[ref:${he... because of No bean could be found in the registry for: ${header.messageId}RequestProcessor of type: org.apache.camel.Processor
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1298)
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:204)
at org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:1087)
at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:3540)
at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3271)
at org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:202)
Iはまた、豆成分と試みたが、結果は同じです。
誰もここで少し手を差し伸べることはできますか? プロセッサを動的にロードするには?
Type1RequestProcessor.java
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
public class Type1RequestProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
// Do Type1 process implementation
}
}
Type2RequestProcessor.java
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
public class Type2RequestProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
// Do Type2 process implementation
}
}
注: Iは、ルータ自体の処理方法の中に動的にこれらの実装をロードするの平面B(匿名を有しますインナークラス)。しかし、私はそれが完全に私が探しているものに合うので、これを探しています。
- キャメルバージョン:2.19.2
- WildFlyバージョン:10.1.0
- キャメルパッチバージョン: wildfly-ラクダパッチ4.9.0
FAQを参照してください:http://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html –
Thanx Claus Ibsen、私が探しているのは、プロセッサ。 URIを動的に呼び出すことはありません。 URIを動的に呼び出す必要がある場合は、私はcamel 2.19を使用しているので、toD()も使用できます。 – namalfernandolk