java vert.x
如果您是Java程序员,则很有可能您过去曾经使用JavaScript,或者在不久的将来会使用JavaScript。 它不仅是最流行(也是最有用)的编程语言之一,了解一些JavaScript功能可以帮助您构建下一个超级受欢迎的Web应用程序。
在服务器上运行JavaScript的想法并不新鲜; 实际上,在1995年12月,发布用于浏览器JavaScript之后不久,Netscape引入了用Netscape Enterprise Server进行服务器端脚本编写的语言实现。 微软还在Internet Information Server上采用了JScript,它是Netscape JavaScript的反向工程实现。
许多企业已将Java虚拟机(JVM)标准化为运行关键任务业务应用程序的首选平台,并且已在JVM上进行了大量投资,因此对于那些组织而言,寻找基于JVM的组织是有意义JavaScript运行时。
Eclipse Vert.x是可在JVM上运行的多语言React式运行时。 将Eclipse Vert.x与JavaScript一起使用与从Node.js期望的并没有太大不同。 存在局限性,例如JVM JavaScript引擎与ES6标准不完全兼容,并且并非所有Node.js软件包管理器(npm)模块都可以与之一起使用。 但是它仍然可以做一些有趣的事情。
在JVM上进行大量投资并且不希望切换到其他运行时,可能足以使企业对Eclipse Vert.x感兴趣。 但是其他好处是它可以与任何现有的Java应用程序进行交互,并且可以在JVM上提供最佳性能之一。
为了演示,让我们看一下Vert.x如何与现有的业务规则管理系统一起工作。 想象一下,我们的虚构企业在JBoss Drools中运行着一个关键任务应用程序。 现在,我们需要创建一个可以与此旧版应用程序进行交互的新Web应用程序。
为了简单起见,假设我们现有的规则是一个简单的Hello World:
package drools
//list any import classes here.
//declare any global variables here
rule "Greetings"
when
greetingsReferenceObject: Greeting( message == "Hello World!" )
then
greetingsReferenceObject.greet();
end
当该引擎运行时,我们会看到“ Drools Hello World!”。 这并不令人惊奇,但让我们想象这是一个非常复杂的过程。
与其他任何JavaScript项目一样,我们将使用标准的npm命令来引导项目。 这是引导项目drools-integration
并准备使用Vert.x的方法:
# create an empty project directory
mkdir drools-integration
cd drools-integration
# create the initial package.json
npm init
-y
# add a couple of dependencies
npm add vertx-scripts
--save-dev
# You should see a tip like:
#Please add the following scripts to your 'package.json':
# "scripts": {
# "postinstall": "vertx-scripts init",
# "test": "vertx-scripts launcher test -t",
# "start": "vertx-scripts launcher run",
# "package": "vertx-scripts package"
# }
# add
npm add
@ vertx
/ web
--save-prod
我们已经初始化了一个准项目,因此我们可以开始编写JavaScript代码。 我们将首先添加一个公开简单API的简单HTTP服务器。 每次对URL http://localhost:8080/greetings
进行请求时,我们都应该在终端中看到现有Drools引擎的执行结果。
首先创建一个index.js
文件。 如果您使用的是VisualStudio代码,明智的做法是将以下两行添加到文件的开头:
/// <reference types="@vertx/core/runtime" />
/// @ts-check
这些行将提供全面支持,并检查代码中的语法错误。 它们不是必需的,但是在开发阶段肯定会有所帮助。
接下来,添加简单的HTTP服务器。 在JVM上运行与在Node上运行并不完全相同,并且许多库将不可用。 将JVM视为无头浏览器,在许多情况下,在浏览器中运行的代码可以在JVM上运行。 这并不意味着我们不能拥有高性能的HTTP服务器; 实际上,这正是Vert.x所做的。 让我们开始编写服务器:
import
{ Router
} from
'@vertx/web'
;
// route all request based on the request path
const app
= Router.
router
( vertx
)
;
app.
get
(
'/greetings'
) .
handler
(
function
( ctx
)
{
// will invoke our existing drools engine here...
}
)
;
vertx
// create a HTTP server
.
createHttpServer
(
)
// on each request pass it to our APP
.
requestHandler
(
function
( req
)
{
app.
accept
( req
)
;
}
)
// listen on port 8080
.
listen
(
8080
)
;
该代码并不复杂,应该是不言自明的,因此让我们集中讨论以Drools规则的形式与现有JVM代码和库的集成。 由于Drools是基于Java的工具,因此我们应该使用java
构建工具来构建应用程序。 幸运的是,由于在后台, vertx-scripts
将JVM位委托给Apache Maven,因此我们的工作很容易。
mkdir -p src/main/java/drools
mkdir -p src/main/resources/drools
接下来,我们添加文件src/main/resources/drools/rules.drl
,内容如下:
package drools
//list any import classes here.
//declare any global variables here
rule "Greetings"
when
greetingsReferenceObject: Greeting( message == "Hello World!" )
then
greetingsReferenceObject.greet();
end
然后,我们将添加文件src/main/java/drools/Greeting.java
,内容如下:
最后,我们将添加帮助程序实用程序类src/main/java/drools/DroolsHelper.java
:
package
drools
;
import
org.drools.compiler.compiler.*
;
import
org.drools.core.*
;
import
java.io.*
;
public
final
class DroolsHelper
{
/**
* Simple factory to create a Drools WorkingMemory from the given `drl` file.
*/
public
static WorkingMemory load
(
String drl
)
throws
IOException , DroolsParserException
{
PackageBuilder packageBuilder
=
new PackageBuilder
(
)
;
packageBuilder.
addPackageFromDrl
(
new
StringReader
( drl
)
)
;
RuleBase ruleBase
= RuleBaseFactory.
newRuleBase
(
)
;
ruleBase.
addPackage
( packageBuilder.
getPackage
(
)
)
;
return ruleBase.
newStatefulSession
(
)
;
}
/**
* Simple factory to create a Greeting objects.
*/
public
static Greeting createGreeting
(
String message,
Runnable andThen
)
{
return
new Greeting
(
)
{
@Override
public
String getMessage
(
)
{
return message
;
}
@Override
public
void greet
(
)
{
andThen.
run
(
)
;
}
}
;
}
}
我们不能直接使用该文件; 我们需要流drools
。 为此,我们向package.json
添加一个名为mvnDependencies
的自定义属性(遵循通常的模式):
{
"mvnDependencies": {
"org.drools:drools-compiler": "6.0.1.Final"
}
}
当然,由于我们更新了项目文件,因此我们应该更新npm:
npm install
现在,我们进入该项目的最后一步,将Java和JavaScript混合在一起。 我们之前有一个占位符,所以让我们填补空白。 我们首先使用助手Java类创建引擎(您现在可以看到Vert.x的功能,这是一个真正的多语言运行时),然后在HTTP请求到达时调用我们的引擎。
// get a reference from Java to the JavaScript runtime
const DroolsHelper
= Java.
type
(
'drools.DroolsHelper'
)
;
// get a drools engine instance
const engine
= DroolsHelper.
load
( vertx.
fileSystem
(
) .
readFileBlocking
(
"drools/rules.drl"
)
)
;
app.
get
(
'/greetings'
) .
handler
(
function
( ctx
)
{
// create a greetings message
var greeting
= DroolsHelper.
createGreeting
(
'Hello World!'
,
function
(
)
{
// when a match happens you should see this message
console.
log
(
'Greetings from Drools!'
)
;
}
)
;
// run the engine
engine.
insert
( greeting
)
;
engine.
fireAllRules
(
)
;
// complete the HTTP response
ctx.
response
(
) .
end
(
)
;
}
)
;
如这个简单的示例所示,Vert.x允许您成为真正的多语种。 选择Vert.x的原因不是因为它是另一个JavaScript运行时,而是允许您重用已有的运行时并使用运行Internet的工具和语言快速构建新代码的运行时。 我们在这里没有谈到性能(因为它本身就是一个主题),但是我鼓励您参考独立的基准测试(例如TechEmpower)来探讨该主题。
翻译自: https://opensource.com/article/18/4/benefits-javascript-vertx
java vert.x