当前位置: 首页 > 工具软件 > Vert.x > 使用案例 >

java vert.x_使用Vert.x将JavaScript引入Java企业

吕树
2023-12-01

java vert.x

如果您是Java程序员,则很有可能您过去曾经使用JavaScript,或者在不久的将来会使用JavaScript。 它不仅是最流行(也是最有用)的编程语言之一,了解一些JavaScript功能可以帮助您构建下一个超级受欢迎的Web应用程序。

服务器上JavaScript

在服务器上运行JavaScript的想法并不新鲜; 实际上,在1995年12月,发布用于浏览器JavaScript之后不久,Netscape引入了用Netscape Enterprise Server进行服务器端脚本编写的语言实现。 微软还在Internet Information Server上采用了JScript,它是Netscape JavaScript的反向工程实现。

企业和JVM

许多企业已将Java虚拟机(JVM)标准化为运行关键任务业务应用程序的首选平台,并且已在JVM上进行了大量投资,因此对于那些组织而言,寻找基于JVM的组织是有意义JavaScript运行时。

Eclipse Vert.x是可在JVM上运行的多语言React式运行时。 将Eclipse Vert.x与JavaScript一起使用与从Node.js期望的并没有太大不同。 存在局限性,例如JVM JavaScript引擎与ES6标准不完全兼容,并且并非所有Node.js软件包管理器(npm)模块都可以与之一起使用。 但是它仍然可以做一些有趣的事情。

为什么选择Eclipse Vert.x?

在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!”。 这并不令人惊奇,但让我们想象这是一个非常复杂的过程。

实施Eclipse Vert.x JavaScript项目

与其他任何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 ,内容如下:



   
   
package drools ;

public interface Greeting {

  String getMessage ( ) ;

  void greet ( ) ;
}

最后,我们将添加帮助程序实用程序类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

 类似资料: