【问题标题】:JBoss Fuse / Apache camel won't resolve language js (javascript) for bundleJBoss Fuse / Apache camel 不会为 bundle 解析语言 js (javascript)
【发布时间】:2014-01-08 13:37:03
【问题描述】:

我正在将 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

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

【问题讨论】:

    标签: java javascript bundle apache-camel jbossfuse


    【解决方案1】:

    并且你已经安装了功能

    features:install camel-script
    

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

    features:install camel-script-javascript
    

    【讨论】:

    • 嗨克劳斯,谢谢,我最初在将这些功能安装为我自己的功能的依赖项时遇到了一些问题,所以我在我的配置文件中手动安装了它们 - 它们现在已安装,但我仍然收到错误。可能是因为这个我想知道:servicemix.396122.n5.nabble.com/… org.apache.camel.script.osgi.Activator in v2.10.0.readhat-60024 is missing languageResolvers...
    • 好的,我有一个解决方案,这是由于RhinoScriptEngineFactorygetLanguageName() 返回的值不是js!它返回 ECMAScript 并且未被语言解析器找到。我会整理我的代码,稍后再展示给你看:)
    • 欢迎您在 Apache Camel 上登录 JIRA,这样我们也可以将 ECMAScript 检测为 js 名称。
    • 别担心:issues.apache.org/jira/browse/CAMEL-7122。请参阅我的其他答案以了解 2.10.0 中的解决方法。
    • 从 jira 更新,看起来这在 2.13 中已修复
    【解决方案2】:

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

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

    groovy(而不是 Groovy)也是如此,但请注意:这部分未经测试。

    如何解决:

    1. this page 复制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>
      

    也许还有另一种解决方案,但同时这对我有用。

    【讨论】:

      【解决方案3】:

      暂时(我正在使用 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多