骆驼 3.2 和 Javascript
Camel 3.2 and Javascript
我们正忙于将骆驼路线从 2.x 升级到 3.2,并且 运行 遇到了 JavaScript 的使用问题。在我们的应用程序中,JavaScript 被广泛用于将简单的 JSON 转换为其他 JSON。我们也广泛使用 XML DSL。我们的典型模式类似于以下简化代码:
<transform id="transform_customer_response">
<javaScript>
<![CDATA[
(function map() {
var msg = {
name: request.body.name,
hash: request.headers.hash
};
return JSON.stringify(msg);
})()
]>
</javaScript>
</transform>
我了解 <javaScript>
语言组件已在 Camel 3 中弃用和删除,因为最新文档没有显示这一点。然而,JavaScript 似乎仍然通过 <language language="javascript">
标签得到支持。
其他背景资料:
- Springboot版本: 2.2.6.RELEASE
- Apache Camel 版本: 3.2.0
- JDK/VM: OpenJDK 64 位服务器 VM GraalVM CE 20.0.0(构建
11.0.6+9-jvmci-20.0-b02,混合模式,共享)
- Link 到此处的 Camel 文档: https://camel.apache.org/components/3.2.x/language-component.html
我尝试将上面的代码翻译成下面的代码,但得到一个 No language could be found for: javascript
异常。
<language language="javascript">
(function map() {
var msg = {
name: request.body.name,
hash: request.headers.hash
};
return JSON.stringify(msg);
})()
</language>
完整堆栈跟踪:
org.apache.camel.FailedToCreateRouteException: Failed to create route createCustomerRoute at: >>> Transform[javascript{
(function map() {
var msg = {
name: request.body.name,
hash: request.headers.hash
};
return JSON.stringify(msg);
})()
}] <<< in route: Route(createCustomerRoute)[From[direct:create_customer] -> [... because of No language could be found for: javascript
at org.apache.camel.reifier.RouteReifier.doCreateRoute(RouteReifier.java:393) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.RouteReifier.createRoute(RouteReifier.java:117) ~[camel-core-engine-3.2.0.jar:3.2.0]
at `No language could be found for: javascript`org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:353) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:327) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.impl.engine.AbstractCamelContext.doInit(AbstractCamelContext.java:2598) ~[camel-base-3.2.0.jar:3.2.0]
at org.apache.camel.support.service.BaseService.init(BaseService.java:83) ~[camel-api-3.2.0.jar:3.2.0]
at org.apache.camel.impl.engine.AbstractCamelContext.init(AbstractCamelContext.java:2431) ~[camel-base-3.2.0.jar:3.2.0]
at org.apache.camel.support.service.BaseService.start(BaseService.java:111) ~[camel-api-3.2.0.jar:3.2.0]
at org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2448) ~[camel-base-3.2.0.jar:3.2.0]
at org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:121) ~[camel-spring-3.2.0.jar:3.2.0]
at org.apache.camel.spring.CamelContextFactoryBean.start(CamelContextFactoryBean.java:373) ~[camel-spring-3.2.0.jar:3.2.0]
at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:420) ~[camel-spring-3.2.0.jar:3.2.0]
at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:94) ~[camel-spring-3.2.0.jar:3.2.0]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:897) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at com.ventia.nexusarchetype.NexusArchetypeApplication.main(NexusArchetypeApplication.java:12) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.2.6.RELEASE.jar:2.2.6.RELEASE]
Caused by: org.apache.camel.NoSuchLanguageException: No language could be found for: javascript
at org.apache.camel.impl.engine.DefaultLanguageResolver.noSpecificLanguageFound(DefaultLanguageResolver.java:92) ~[camel-base-3.2.0.jar:3.2.0]
at org.apache.camel.impl.engine.DefaultLanguageResolver.resolveLanguage(DefaultLanguageResolver.java:68) ~[camel-base-3.2.0.jar:3.2.0]
at org.apache.camel.impl.engine.AbstractCamelContext.resolveLanguage(AbstractCamelContext.java:1726) ~[camel-base-3.2.0.jar:3.2.0]
at `No language could be found for: javascript`org.apache.camel.reifier.language.ExpressionReifier.createExpression(ExpressionReifier.java:116) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.AbstractReifier.createExpression(AbstractReifier.java:102) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.TransformReifier.createProcessor(TransformReifier.java:34) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.ProcessorReifier.makeProcessor(ProcessorReifier.java:766) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.ProcessorReifier.addRoutes(ProcessorReifier.java:511) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.RouteReifier.doCreateRoute(RouteReifier.java:391) ~[camel-core-engine-3.2.0.jar:3.2.0]
... 32 common frames omitted
我尝试使用 groovy 生成了 No language could be found for: groovy
。然后我为 groovy 添加依赖项,如下所示:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-groovy-starter</artifactId>
<!-- use the same version as your Camel core version -->
</dependency>
这有效我可以使用 groovy 转换 body 并且没有任何问题。所以我错过了 javascript dependency/start 但是当我尝试添加下面的依赖项时却找不到。我也检查了 maven 我找不到 Camel 3.2 的 camel-javascript-starter。
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-javascript-starter</artifactId>
<!-- use the same version as your Camel core version -->
</dependency>
看起来 JavaScript 确实已经完全弃用了。但是文档仍然暗示它可用。
请参阅下面的文档片段:
语言名称:
必需设置要使用的语言的名称。该值可以是以下之一:bean、constant、exchangeProperty、file、groovy、header、javascript、jsonpath、mvel、ognl、ref、simple、spel、sql, terser, tokenize, xpath, xquery, xtokenize
简而言之,要么 Camel 3.2 缺少依赖项,要么Javascript 已被弃用。还是我完全错过了什么。
Javascript 语言是 camel-script
依赖的一部分。它已在 2.x 中弃用,并在 3.x 中通过 CAMEL-13113. This is because Nashorn engine, which is heavily used in camel-script
, is deprecated in JDK11 (JEP 335) and is scheduled to be removed from next JDK release (JEP 372 删除)。
目前 Apache Camel 中没有直接替代品。我已经登录 CAMEL-14970 寻找替代引擎。
我们正忙于将骆驼路线从 2.x 升级到 3.2,并且 运行 遇到了 JavaScript 的使用问题。在我们的应用程序中,JavaScript 被广泛用于将简单的 JSON 转换为其他 JSON。我们也广泛使用 XML DSL。我们的典型模式类似于以下简化代码:
<transform id="transform_customer_response">
<javaScript>
<![CDATA[
(function map() {
var msg = {
name: request.body.name,
hash: request.headers.hash
};
return JSON.stringify(msg);
})()
]>
</javaScript>
</transform>
我了解 <javaScript>
语言组件已在 Camel 3 中弃用和删除,因为最新文档没有显示这一点。然而,JavaScript 似乎仍然通过 <language language="javascript">
标签得到支持。
其他背景资料:
- Springboot版本: 2.2.6.RELEASE
- Apache Camel 版本: 3.2.0
- JDK/VM: OpenJDK 64 位服务器 VM GraalVM CE 20.0.0(构建 11.0.6+9-jvmci-20.0-b02,混合模式,共享)
- Link 到此处的 Camel 文档: https://camel.apache.org/components/3.2.x/language-component.html
我尝试将上面的代码翻译成下面的代码,但得到一个 No language could be found for: javascript
异常。
<language language="javascript">
(function map() {
var msg = {
name: request.body.name,
hash: request.headers.hash
};
return JSON.stringify(msg);
})()
</language>
完整堆栈跟踪:
org.apache.camel.FailedToCreateRouteException: Failed to create route createCustomerRoute at: >>> Transform[javascript{
(function map() {
var msg = {
name: request.body.name,
hash: request.headers.hash
};
return JSON.stringify(msg);
})()
}] <<< in route: Route(createCustomerRoute)[From[direct:create_customer] -> [... because of No language could be found for: javascript
at org.apache.camel.reifier.RouteReifier.doCreateRoute(RouteReifier.java:393) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.RouteReifier.createRoute(RouteReifier.java:117) ~[camel-core-engine-3.2.0.jar:3.2.0]
at `No language could be found for: javascript`org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:353) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:327) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.impl.engine.AbstractCamelContext.doInit(AbstractCamelContext.java:2598) ~[camel-base-3.2.0.jar:3.2.0]
at org.apache.camel.support.service.BaseService.init(BaseService.java:83) ~[camel-api-3.2.0.jar:3.2.0]
at org.apache.camel.impl.engine.AbstractCamelContext.init(AbstractCamelContext.java:2431) ~[camel-base-3.2.0.jar:3.2.0]
at org.apache.camel.support.service.BaseService.start(BaseService.java:111) ~[camel-api-3.2.0.jar:3.2.0]
at org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2448) ~[camel-base-3.2.0.jar:3.2.0]
at org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:121) ~[camel-spring-3.2.0.jar:3.2.0]
at org.apache.camel.spring.CamelContextFactoryBean.start(CamelContextFactoryBean.java:373) ~[camel-spring-3.2.0.jar:3.2.0]
at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:420) ~[camel-spring-3.2.0.jar:3.2.0]
at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:94) ~[camel-spring-3.2.0.jar:3.2.0]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:897) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at com.ventia.nexusarchetype.NexusArchetypeApplication.main(NexusArchetypeApplication.java:12) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.2.6.RELEASE.jar:2.2.6.RELEASE]
Caused by: org.apache.camel.NoSuchLanguageException: No language could be found for: javascript
at org.apache.camel.impl.engine.DefaultLanguageResolver.noSpecificLanguageFound(DefaultLanguageResolver.java:92) ~[camel-base-3.2.0.jar:3.2.0]
at org.apache.camel.impl.engine.DefaultLanguageResolver.resolveLanguage(DefaultLanguageResolver.java:68) ~[camel-base-3.2.0.jar:3.2.0]
at org.apache.camel.impl.engine.AbstractCamelContext.resolveLanguage(AbstractCamelContext.java:1726) ~[camel-base-3.2.0.jar:3.2.0]
at `No language could be found for: javascript`org.apache.camel.reifier.language.ExpressionReifier.createExpression(ExpressionReifier.java:116) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.AbstractReifier.createExpression(AbstractReifier.java:102) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.TransformReifier.createProcessor(TransformReifier.java:34) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.ProcessorReifier.makeProcessor(ProcessorReifier.java:766) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.ProcessorReifier.addRoutes(ProcessorReifier.java:511) ~[camel-core-engine-3.2.0.jar:3.2.0]
at org.apache.camel.reifier.RouteReifier.doCreateRoute(RouteReifier.java:391) ~[camel-core-engine-3.2.0.jar:3.2.0]
... 32 common frames omitted
我尝试使用 groovy 生成了 No language could be found for: groovy
。然后我为 groovy 添加依赖项,如下所示:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-groovy-starter</artifactId>
<!-- use the same version as your Camel core version -->
</dependency>
这有效我可以使用 groovy 转换 body 并且没有任何问题。所以我错过了 javascript dependency/start 但是当我尝试添加下面的依赖项时却找不到。我也检查了 maven 我找不到 Camel 3.2 的 camel-javascript-starter。
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-javascript-starter</artifactId>
<!-- use the same version as your Camel core version -->
</dependency>
看起来 JavaScript 确实已经完全弃用了。但是文档仍然暗示它可用。
请参阅下面的文档片段:
语言名称:
必需设置要使用的语言的名称。该值可以是以下之一:bean、constant、exchangeProperty、file、groovy、header、javascript、jsonpath、mvel、ognl、ref、simple、spel、sql, terser, tokenize, xpath, xquery, xtokenize
简而言之,要么 Camel 3.2 缺少依赖项,要么Javascript 已被弃用。还是我完全错过了什么。
Javascript 语言是 camel-script
依赖的一部分。它已在 2.x 中弃用,并在 3.x 中通过 CAMEL-13113. This is because Nashorn engine, which is heavily used in camel-script
, is deprecated in JDK11 (JEP 335) and is scheduled to be removed from next JDK release (JEP 372 删除)。
目前 Apache Camel 中没有直接替代品。我已经登录 CAMEL-14970 寻找替代引擎。