JBoss Fuse / Apache camel不会解析bundle的语言js(javascript)

时间:2014-01-08 13:37:03

标签: java javascript bundle apache-camel jbossfuse

我正在向JBoss Fuse / Apache Camel部署osgi应用程序,javascript语言不想解析。

此错误出现在日志中:

ERROR | BluePrinntContainerImpl | Bundle my-service is waiting for dependencies
[(&(language=js)(objectClass=org.apache.camel.spi.LanguageResolver))]

我最近在.javaScript()语句中添加了.choice()表达式定义:

.choice()
    .when()
    .javaScript("request.body.updateSeq > exchange.getProperty('PrevUpdateSeq') + 1")
    .to("dosomething")

的Maven:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-script</artifactId>
        <version>${camel.version}</version>
    </dependency>

其中camel版本为2.10.0.redhat-60024

有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:0)

您已安装了这些功能

features:install camel-script

并且可能有一个特殊的javascript命名的东西:

features:install camel-script-javascript

答案 1 :(得分:0)

问题是由于没有注册javascript语言。

我修改了一些我在servicemix nabble上找到的代码,以确保javascript引擎已注册并且具有密钥(语言名称)js而不是ECMAScript

同样适用于groovy(而不是Groovy),但请注意:此部分未经测试。

如何解决:

  1. this page复制Activator代码,并将其添加为项目中的新类。

  2. 修改register()中的BundleLanguageResolver方法,如下所示:

    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);
        }
    }
    
  3. 将您刚创建的课程(例如com.my.Activator)作为Bundle-Activator添加到联系人。 maven-bundle-plugin行看起来像这样:

    <Bundle-Activator>com.my.Activator</Bundle-Activator>
    
  4. 也许还有另一种解决方案,但与此同时,这对我有用。

答案 2 :(得分:0)

暂时(我正在使用Camel 2.16.5)添加google的scriptengine作为依赖可以解决问题:

<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>