天天看点

让java-web应用内嵌类node.js容器:保护资产与已有投入

抱怨过了,街也骂过了(第一篇,第二篇,第三篇,第四篇)。那么重要的是我们其实需要解决问题。

在node.js的压力下,个人选择jvm上内嵌类似nodejs的js容器作为思路与方向。事实上,这种东西java也早有了。rhino,rhino可能是最早在服务端运行js之一,而且早在java1.4时期就是我就尝试用过,java6变成java标准实现的一部分。但是对比nodejs的npm,他的周边库少的可怜。

nodejs为何有如此强大的社区,这要归功于common-js标准以及npm社区库。这让nodejs开发模块部署非常便利。

okok。nodejs的优势是这个。其实呢jvm上也有符合common-js标准的实现。

那就是:

  RingoJs:ringojs.org

  Vertx:vertx.io

其中vertx更是号称在jvm上替代nodejs的实现,支持多种语言。

然而,对于这两个平台(姑且这么说)。其官方默认推荐方式,都是整体js化。即,用户撰写包括httpserver在内,均使用js写一遍,main入口也用js完成。这种方式与单独使用nodejs用法一样,只是他们可以引用一些java类之类进行一些功能扩展。

另一方面传统java应用开发已经由来已久,最典型的标准就是java web标准如servlet,开发人员以及企业已经投入大量的经理进行构建。

如果在使用时还需要完全用新的代码重写以前本来由webserver提供的功能,真的很无法接受。那么其实我们要的是既能够使用js-scripting带来的便利易用,同时有保护已有的资产,复用java的已有资源且主要是框架资源,webserver(weblogic等)、静态框架或容器(spring等)。

也许将js-scripting 引擎容器嵌入已有的javaweb-app是比较能够接受的用法。

选型:

ringo 较为轻量实现,但是其需要依赖rhino独立包而不是jdk内置的版本。且其比较贴近common-js标准。

vertx是nodejs的复刻,功能较多相对跟活跃,且已经进入eclipse开源社区。当然其对common-js支持与nodejs类似,不算很标准。其需要java7版本的内置scripting机制。

然而在我之前浏览其各自的开发过程时,vertx支持多语言实现,文档中有一句:

If you are embedding this way you should be aware that

  • You will only be able to use Vert.x with Java, not any of the other languages that Vert.x suppports.

这让我相当无语。也就是说,其嵌入java中后无法使用其他语言????(我并没有深入了解vertx,希望各位大大能提供一个解决办法,集成vertx是最好的选择。)

既然如此,首先选择ringojs作为js容器嵌入已有java应用的切口。果然轻量有轻量的好处,ringo的jsgi实现与JsgiServlet提供了很好的集成样例。

后续通过ringo的学习以及尝试建立自制的功能扩展来完成java与ringo的集成的样例。