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



我正在将一个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),但请注意:这部分未经测试。

如何解决:

  1. 复制此页中的Activator代码,并将其作为新类添加到项目中。

  2. 修改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);
        }
    }
    
  3. 添加您刚刚创建的类(例如 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>

最新更新