在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&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&uriResolver=uriResolver" />
<camel:process
ref="com.acme.MetricsProcessor" />
</camel:policy>
</camel:route>
以下jar文件存在于Web应用程序中:
我正在使用:
以下是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路由。