我正在将一个osgi应用程序部署到JBoss Fuse/Apache Camel,而javascript语言不想解析。
此错误出现在日志中:
ERROR | BluePrinntContainerImpl | Bundle my-service is waiting for dependencies
[(&(language=js)(objectClass=org.apache.camel.spi.LanguageResolver))]
我最近在 .choice()
语句中添加了一个.javaScript()
表达式定义:
.choice()
.when()
.javaScript("request.body.updateSeq > exchange.getProperty('PrevUpdateSeq') + 1")
.to("dosomething")
专家:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-script</artifactId>
<version>${camel.version}</version>
</dependency>
骆驼版本2.10.0.redhat-60024
.
有没有办法解决这个问题?
并且您已经安装了这些功能
features:install camel-script
并且可能有一个特殊的javascript命名为如下:
features:install camel-script-javascript
该问题是由于未注册 JavaScript 语言。
我修改了我在 servicemix nabble 上找到的一些代码,以确保 javascript 引擎已注册并且具有js
而不是ECMAScript
的键(语言名称)。
groovy
也是如此(而不是Groovy
),但请注意:这部分未经测试。
如何解决:
-
复制此页中的
Activator
代码,并将其作为新类添加到项目中。 -
修改
BundleLanguageResolver
中的register()
方法,如下所示:public void register() { try { String language = factory.getLanguageName(); // Hack to register languages correctly if ("ECMAScript".equals(language)) language = "js"; if ("Groovy".equals(language)) language = "groovy"; Hashtable<String, Object> properties = new Hashtable<String, Object>(); properties.put("language", language); reg = bundle.getBundleContext().registerService( LanguageResolver.class, new ScriptLanguageResolver(), properties); LOG.debug("Register LanguageResolver: " + language); } catch(Exception e) { LOG.warn("Cannot register LanguageResolver: " + e.getClass().getName(), e); } }
-
添加您刚刚创建的类(例如
com.my.Activator
) 作为Bundle-Activator
的清单。maven-bundle-plugin 行可能看起来像这样:<Bundle-Activator>com.my.Activator</Bundle-Activator>
也许还有另一种解决方案,但与此同时,这对我有用。
目前(我使用的是 Camel 2.16.5),将 google 的脚本引擎添加为依赖项可以解决问题:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-script</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>com.google.code.scriptengines</groupId>
<artifactId>scriptengines-javascript</artifactId>
<version>1.1.1</version>
</dependency>