使用SimpleLanguage时,DefaultLanguageResolver中的Apache Camel运行时错误

时间:2015-08-27 00:23:18

标签: java spring tomcat exception apache-camel

在Camel路由中评估简单语言表达式时,我在Tomcat服务器日志中看到此异常:

java.lang.IllegalArgumentException: Resolving language: simple detected type conflict: Not a Language implementation. Found: org.apache.camel.language.simple.SimpleLanguage
at org.apache.camel.impl.DefaultLanguageResolver.resolveLanguage(DefaultLanguageResolver.java:77)
at org.apache.camel.impl.DefaultCamelContext.resolveLanguage(DefaultCamelContext.java:941)
at org.apache.camel.builder.SimpleBuilder.createExpression(SimpleBuilder.java:73)
at org.apache.camel.builder.SimpleBuilder.evaluate(SimpleBuilder.java:69)
at org.apache.camel.builder.ProcessorBuilder$4.process(ProcessorBuilder.java:96)
at org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:50)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:69)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:171)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:318)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:209)
at org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:305)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:116)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:79)
at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:102)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:69)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:104)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:85)
at org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:121)
at org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:58)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)

以下是来自应用程序的Camel路由示例,其中包括完整性。您可以看到<camel:simple>表达式向下几行:

    <camel:route id="com.acme.doStuffRoute"
        autoStartup="false">
        <camel:from
            uri="spring-ws:rootqname:{namepace}doStuff?endpointMapping=#com.acme.EndpointMapping" />
        <camel:setHeader headerName="Exchange.HTTP_QUERY">
            <camel:simple>certainProperty=${ref:certainProperty}</camel:simple>
        </camel:setHeader>
        <camel:setHeader headerName="CamelHttpMethod">
            <camel:constant>POST</camel:constant>
        </camel:setHeader>
        <camel:policy ref="com.acme.Administrators">
            <camel:to uri="validator:WebService.xsd"/>
            <camel:to
                uri="xslt:/xslt/do-stuff-request.xsl?transformerFactory=transformerFactory&amp;uriResolver=uriResolver"
                pattern="InOut" />
            <camel:to ref="com.acme.ToLogging" />
            <camel:transform>
                <method bean="msgTransform" method="encrypt" />
            </camel:transform>
            <to uri="ref:doMoreStuffEndpoint" />
            <transform>
                <method bean="msgTransform" method="decrypt" />
            </transform>
            <camel:to ref="com.acme.FromLogging" />
            <to
                uri="xslt:/xslt/do-stuff-request.xsl?transformerFactory=transformerFactory&amp;uriResolver=uriResolver" />
            <camel:process
                ref="com.acme.MetricsProcessor" />
        </camel:policy>
    </camel:route>

以下jar文件存在于Web应用程序中:

  • 骆驼芯2.8.1.jar
  • 驼-HTTP-2.8.1.jar
  • 驼http4-2.8.1.jar
  • 骆驼JAXB-2.8.1.jar
  • 驼-JMS-2.8.1.jar
  • 骆驼邮件2.8.1.jar
  • 骆驼米娜-2.8.1.jar
  • 驼 - 弹簧 - 2.8.1.jar
  • 驼 - 弹簧 - 安全2.8.1.jar
  • 骆驼弹簧-WS-2.8.1.jar
  • 骆驼流2.8.1.jar

我正在使用:

  • JRE 8 update 45
  • Apache Tomcat 7.0.62
  • Windows Server 2008

以下是camel-core-2.8.1中DefaultLanguageResolver的摘录,其中发生此异常:

Class type = null;
    try {
        type = findLanguage(name, context);
    } catch (NoFactoryAvailableException e) {
        // ignore
    } catch (Exception e) {
        throw new IllegalArgumentException("Invalid URI, no Language registered for scheme: " + name, e);
    }

    if (type != null) {
        if (Language.class.isAssignableFrom(type)) {
            return (Language)context.getInjector().newInstance(type);
        } else {
            throw new IllegalArgumentException("Resolving language: " + name + " detected type conflict: Not a Language implementation. Found: " + type.getName());
        }
    } else {
        // no specific language found then try fallback
        return noSpecificLanguageFound(name, context);
    }

在具有相同环境的大约4台机器中发生异常。以前,在执行所有软件(Tomcat,Java,我的webapp等)的全新安装后,该异常将消失,但不再修复它。

有些路由将在全新安装后无错运行,但在安装后第一次重启Tomcat服务器后无限期地开始异常。

该错误特别意味着SimpleLanguage类不能分配给Language类。但是,SimpleLanguage实现了语言。我知道isAssignableFrom是一个本机Java方法,因此Camel版本可能与Java版本不同步,但这并不能解释为什么问题出现在某些机器上而不是其他机器上。

如果可以使用除Simple之外的其他表达式语言来评估这些简单表达式,那么如果可以提供示例,我也会对此作出答案。

编辑:上面列出的骆驼罐子实际上存在于我的Tomcat中的两个不同的webapps中。如果我从其中一个webapps中删除一个camel-core jar,我不再得到这个例外,并且路由正常。然而,我为camel-core中的另一个类获取了一个ClassNotFoundException,用于不同的Camel路由。

0 个答案:

没有答案