データベースに格納された構成パラメータに基づいて動的にラクダルートを構築します。私たちにはすべてのラクダルートを構築するジェネリッククラスがあります。一部のパラメータは生のCamel Spring XMLとして表示されました。 RouteBuilderを拡張し、ここでラクダ経路を構築するコードの一部であるラクダルートを構築するクラス:Apache XML Camel java.lang.ClassCastExceptionは、SpringのXML構成コンポーネントから動的に経路を構築するときに使用します。
@Override
public void configure() throws Exception {
RouteDefinition route = from(inputFile);
configureSpringXMLActivity(0, route, convertBodyXml);
configureSpringXMLActivity(5, route, setHeaderXml);
}
void configureSpringXMLActivity(final Integer seq, final RouteDefinition route, final String xmlConfig)
throws Exception {
ActivityIdentifier identifier = new CamelActivityIdentifier(seq);
route.process(new ActivityHandoverProcessor(identifier));
final ChoiceDefinition choice = route.choice().when(new ActivityPredicate(identifier));
RouteContext routeContext = new DefaultRouteContext(camelContext, route, route.getInputs().get(0),
camelContext.getRoutes());
final StringReader reader = new StringReader(xmlConfig);
Object result = esb.getConfigUnmarshaller().unmarshal(reader);
if (result != null) {
ProcessorDefinition<?> processorDefinition = (ProcessorDefinition<?>) result;
Processor processor = processorDefinition.createProcessor(routeContext);
choice.process(processor);
}
/** setHeader xml. */
private final String setHeaderXml = "<setHeader headerName=\"extractFileName\" xmlns=\"http://camel.apache.org/schema/spring\"><simple>${body}</simple></setHeader>";
/** convertBody xml. */
private final String convertBodyXml = "<convertBodyTo xmlns=\"http://camel.apache.org/schema/spring\" type=\"java.lang.String\"/>";
我々はラクダコンテキストを起動すると、それはのsetHeaderプロセッサを作成する上で例外を生成します。キャメル(バージョン2.17.0)ソースコードで
java.lang.ClassCastException: org.apache.camel.model.ProcessDefinition cannot be cast to org.apache.camel.model.SetHeaderDefinition
at org.apache.camel.management.DefaultManagementObjectStrategy.getManagedObjectForProcessor(DefaultManagementObjectStrategy.java:355)
at org.apache.camel.management.DefaultManagementLifecycleStrategy.getManagedObjectForProcessor(DefaultManagementLifecycleStrategy.java:515)
at org.apache.camel.management.DefaultManagementLifecycleStrategy.getManagedObjectForService(DefaultManagementLifecycleStrategy.java:467)
at org.apache.camel.management.DefaultManagementLifecycleStrategy.onServiceAdd(DefaultManagementLifecycleStrategy.java:378)
at org.apache.camel.impl.RouteService.startChildService(RouteService.java:338)
at org.apache.camel.impl.RouteService.warmUp(RouteService.java:182)
at org.apache.camel.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCamelContext.java:3496)
at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3426)
at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3203)
at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3059)
at org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:175)
at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2854)
at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2850)
at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:2873)
at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:2850)
at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:2819)
- クラスDefaultManagementObjectStrategy:
..........
} else if(target1 instanceof SetHeaderProcessor) {
answer = new ManagedSetHeader(context, (SetHeaderProcessor)target1, (SetHeaderDefinition)definition);
.........
(SetHeaderDefinition)を鋳造する際に、それが失敗した定義
しかし、私の最初の活動とは問題はありません - convertBodyXml。同じキャメルクラスでは:いくつかの管理作成するときに
DefaultManagementObjectStrategyクラスは、特定の定義にキャストん)...、定義:この場合、
if(target1 instanceof ConvertBodyProcessor) {
answer = new ManagedConvertBody(context, (ConvertBodyProcessor)target1, definition);
キャメルコードは、管理対象オブジェクトを作成するための定義をキャストする必要はありませんでしたオブジェクトではなく、他のオブジェクトではありません。
ClassCastExceptionを回避する方法をお勧めしますが、一般的なProcessorDefinitionオブジェクトからルートを作成することをお勧めしますか。
ありがとうございます。代わりにProcessorDefinition
からProcessor
を構築し、ChoiceDefinition
上のプロセスメソッドを呼び出すの
が何をしようとするためにとても複雑なアプローチのように思える役立つことを願っています
。 –