2

我有一个 javascript 文件(包含一些函数定义)。我想将文件 javascript 包含在我的路线中 Camel 使用的引擎中(理想情况下,我希望对整个 Camel 上下文执行一次。

有没有办法做到这一点?如果有怎么办?

我想做类似的事情:

<route>
   <from uri="direct:example" />
   <to uri="jdbc:mydb" />
   <setBody>
       <javaScript>
           var b = {
               "name":    wrapname(body.get("name")),
               "country": wrapcountry(body.get("country"))
           }
           JSON.stringify(b); 
       </javaScript>
   </setBody>
</route>

我想导入的 javaScript 文件中定义的函数在wrapname哪里?wrapcountry(这些可能用于不同的路线)。

一个辅助问题是什么时候在 Camel 中初始化 javaScript 引擎(全局一次,针对每个 javaScript 表达式)?

谢谢,本杰明

4

2 回答 2

1

从 Camel 2.11 开始,您可以从外部资源加载脚本

您可以将脚本外部化并让 Camel 从诸如“classpath:”、“file:”或“http:”之类的资源中加载它。这是使用以下语法完成的:“resource:scheme:location”,例如引用类路径上的文件,您可以这样做:

有关详细信息,请参见http://camel.apache.org/javascript.html

于 2013-01-31T16:43:25.043 回答
1

将 javascript 代码外部化为“js”文件。例如,test-javascript.js 将包含

var content = request.getBody().toString().toUpperCase();
var substring = "CAMEL";
if (content.indexOf(substring) !== -1) {
	request.setHeader("uppercase", "true");
} else {
	request.setHeader("uppercase", "false");
}
request.setBody(content);

使用这个外部化 javascript 文件的骆驼路线看起来像,

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<routes xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:start" />
        <log message="Got1 ${body}" />
        <setBody >
            <constant>Test message through camel route</constant>
        </setBody>
         <to uri="language://javascript:classpath:test-javascript.js?transform=false" />
         <to uri="log:javascript?showAll=true"/>        
        <log message="Got2 ${body}" />
        <log message="Got3 ${header.uppercase}" />
 </route>
</routes>

它产生的输出如

[main] INFO route1 - Got2 TEST MESSAGE THROUGH CAMEL ROUTE [main] INFO route1 - Got3 true

于 2016-08-30T18:31:48.750 回答