2017-11-04 7 views
1

メッセージヘッダーまたは本文のアトリビュートに応じて、実行時に動的に決定されるプロセッサ経由でメッセージをルーティングするソリューションを見つけることに取り組んでいます。メッセージ本体またはヘッダーのプロパティに応じて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
+0

FAQを参照してください:http://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html –

+0

Thanx Claus Ibsen、私が探しているのは、プロセッサ。 URIを動的に呼び出すことはありません。 URIを動的に呼び出す必要がある場合は、私はcamel 2.19を使用しているので、toD()も使用できます。 – namalfernandolk

答えて

1

ダイナミック表現言語を使用することはできませんあなたのプロセッサに@Namedという注釈を付けると、CDIレジストリで利用できるようになります。その後、.toD(bean:${header.typeId}RequestProcessor)または直接.toD(${header.typeId}RequestProcessor)を使用してBeanコンポーネントを使用して呼び出します。

デフォルトでは、名前付きBean名はクラス名に変換されます。 @Named("Type1RequestProcessor")でこの動作をカスタマイズできます。

+0

こんにちはベドラ、豆と:これは期待どおりうまくいきます。私はそんなに閉ざされていた。しかし、それを私に見えるようにしてください。どうもありがとう!org.apache.camel.ResolveEndpointFailedException:エンドポイントの解決に失敗しました:uri:Type1RequestProcessor bean:[email protected]は、以下の理由でエンドポイントの解決に失敗しました:終点 – namalfernandolk

関連する問題