2016-12-01 5 views
0

データベースに格納された構成パラメータに基づいて動的にラクダルートを構築します。私たちにはすべてのラクダルートを構築するジェネリッククラスがあります。一部のパラメータは生の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上のプロセスメソッドを呼び出すの

+0

が何をしようとするためにとても複雑なアプローチのように思える役立つことを願っています

@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)); final StringReader reader = new StringReader(xmlConfig); Object result = esb.getConfigUnmarshaller().unmarshal(reader); if (result != null) { ProcessorDefinition<?> processorDefinition = (ProcessorDefinition<?>) result; choice.addOutput(result); } 

。 –

答えて

0

、それだけで直接ChoiceDefinitionProcessorDefinitionパラメータでaddOutputメソッドを呼び出すことが可能です。

基本的には、ここでchoice.addOutput(processorDefinition);

は、スニペットに更新されています。私はそれが誰か

関連する問題