在 Nashorn shell 中使用 Camel

x33g5p2x  于2022-09-28 转载在 Shell  
字(3.2k)|赞(0)|评价(0)|浏览(615)

在本教程中,我们将使用 nashorncamel 创建一个非常有趣的组合。

Nashorn 是最新版本 jdk: 8 附带的 javascript 引擎。

使用 Nashorn 可以使用 java 启动 shell 脚本。

您可以启动 nashorn 输入:

> /usr/java/jdk1.8.0_31/bin/jjs

或者

> jjs

Nashorn 与任何其他 shell 一样工作,但它使用 javascript!前面的命令打开交互式 javascript shell。使用 Nashorn,您可以执行 javascript 代码,也可以调用对象上的 java 方法。

在这个例子中,我们在项目的类路径中添加了Camel库,代码被组织在一个文件中:camel.sh

这个例子简单而强大。

在第一行:

#!/usr/java/jdk1.8.0_31/bin/jjs -fv

操作系统被通知:“ehi 我是一个新的 shell:jjs

命令是:

jjs -cp ./log4jproperties:./CamelInNashorn.jar:./src:. camel.sh

-jjs 是 nahsorn 外壳

– cp 是类路径参数

您也可以直接使用 ./filescript.sh 或 sh ./filescript.sh 来启动 jjs 脚本,但是 cp 参数存在错误 (https://bugs.openjdk.java.net/browse/JDK-8072138),因此我更喜欢使用 jjs -cp。

然后我们必须创建一个Camel路线。它是实现方法配置的 RouteBuilder 的简单扩展。

在 nashorn 中,我们可以分两步扩展一个 java 类型:

1)有对java类型的引用来扩展

2)扩展它

var RouteBuilder = Java.type("org.apache.camel.builder.RouteBuilder"); var myRouteBuilder = Java.extend(RouteBuilder);

现在我们可以配置camel****route了。Camel路线是实现企业集成模式的简单活动流。

在此示例中,我们使用内联匿名类。

这种构造有点不方便:我们可以使用静态 Java.super(parent) 方法覆盖或访问父类中只有对超类的引用的方法。 Java.type、Java.extend、Java.super 方法不会被 OOP 的纯粹主义者所喜爱。

现在我们准备好使用camel dsl创建路线了。它是自动解释的:它从文件夹中获取一些文件(xml 文件)并使用 xpath 过滤它们。该文件将根据本书的作者重定向到另一个文件夹。

#!/usr/java/jdk1.8.0_31/bin/jjs -fv  var RouteBuilder = Java.type("org.apache.camel.builder.RouteBuilder"); var myRouteBuilder = Java.extend(RouteBuilder); var route=new myRouteBuilder(){     configure: function() {        var _super = Java.super(route);             _super.from("file:src/data?noop=true") 			.choice()                 		.when( _super.xpath("/book/author = 'Alessio Soldano'"))                     			.log("WebServices")                     			.to("file:target/messages/WS") 			        .when( _super.xpath("/book/author = 'Francesco Marchioni'"))                     			.log("Wildfly")                     			.to("file:target/messages/Wildfly")                 		.otherwise()                     			.log("Other books")                     			.to("file:target/messages/others");              } };

为了启动路由:让它运行并让它监视新添加的文件,我们使用帮助类:“org.apache.camel.main.Main”:这个类管理camel上下文和路由。 camel.sh 脚本的完整代码为:

#!/usr/java/jdk1.8.0_31/bin/jjs -fv  var RouteBuilder = Java.type("org.apache.camel.builder.RouteBuilder"); var myRouteBuilder = Java.extend(RouteBuilder); var route=new myRouteBuilder(){     configure: function() {        var _super = Java.super(route);             _super.from("file:src/data?noop=true") 			.choice()                 		.when( _super.xpath("/book/author = 'Alessio Soldano'"))                     			.log("WebServices")                     			.to("file:target/messages/WS") 			        .when( _super.xpath("/book/author = 'Francesco Marchioni'"))                     			.log("Wildfly")                     			.to("file:target/messages/Wildfly")                 		.otherwise()                     			.log("Other books")                     			.to("file:target/messages/others");              } };   var Main = Java.type("org.apache.camel.main.Main") var mainCamel = new Main(); mainCamel.enableHangupSupport(); mainCamel.addRouteBuilder(route); mainCamel.run();

要运行脚本,我们需要安装 jdk 8。它使 jjs 命令可用。

外壳命令是:

jjs -cp ./log4jproperties:./CamelInNashorn.jar:./src:. camel.sh

类路径引用两个文件:

1)CamelINashorn.jar:是一个带有camel库的jar

  1. src 文件夹是包含用作输入的 data/message[12].xml 文件的文件夹

由于 Nashorn shell 在 jvm 中运行并且Camel公开其 MBean,因此可以使用 jmx 监视路由。

您可以在 jconsole 或连接到 jmx 层的其他工具内部检查已完成的消息数量、错误消息等。

如果您安装了 jdk,只需键入:

jconsole

并点击与 Nashorn shell 相关的进程。

你可以在这里找到代码:

https://github.com/mastertheintegration/Camel-in-Nashorn

要准备 CamelInNashorn.jar,只需键入 pom.xml 的同一文件夹:

mvn clean compile assembly:single

然后复制项目文件夹中的 log4j.properties 和 src 文件夹并启动它:

jjs -cp ./log4jproperties:./CamelInNashorn.jar:./src:. camel.sh

相关文章