GraalJS及平台JS脚本能力建设

news2024/12/25 14:32:49

GraalJS及平台JS脚本能力建设

GraalJS替换Nashorn

Oracle宣布弃用Nashorn Javascript引擎,最终将从未来所有的JDK中删除。

Nashorn最初是在JDK 8中引入的,用于取代Rhino脚本引擎。发布时,Nashorn是ECMAScript-262 5.1的完整实现,增强了Java和JavaScript的兼容性,并增加了新的ECMAScript 6(ES6)特性。借助Nashorn,开发人员可以从JavaScript调用Java代码,也可以从Java代码调用JavaScript函数。Nashorn实现javax.script API,弃用Nashorn不会影响javax.script API。

Oracle实验室高级研究总监Thomas Wuerthinger表示,GraalVM是一个不错的替代方案,与Nashorn相比,它的性能更好,与ECMAScript的兼容性也更好。

Javax.script API

javax.script 脚本API由定义Java脚本引擎的接口和类组成,提供在Java应用程序中的使用脚本的框架。

javax.script包的功能主要包括

脚本执行:脚本是用作脚本引擎执行的程序源的字符流。 使用ScriptEngine的eval方法和Invocable接口的方法执行脚本。

绑定:允许Java对象作为命名变量绑定给脚本程序。 见:Bindings和ScriptContext类。

编译:允许重复存储和执行脚本引擎前端生成的中间代码。 这有利于多次执行相同脚本的应用程序以提高效率,因为引擎的前端只需要每个脚本执行一次,而不是每次执行脚本一次。 请注意,此功能是可选的,脚本引擎可能会选择不实现它。需要使用instanceof来检查Compilable接口的可用性。

调用:允许重用脚本引擎前端生成的中间代码。 编译允许重新执行由中间代码表示的整个脚本,而调用功能允许重新执行脚本中的各个过程/方法。 与编译的情况一样,并非所有脚本引擎都需要提供此功能。须检查Invocable的可用性。

脚本引擎发现: 引擎发现机制基于ServiceLoader类中描述的服务提供者加载工具。 ScriptEngineManager包括getEngineFactories方法,以获取所有ScriptEngineFactory实例。 ScriptEngineFactory具有查询脚本引擎属性的方法。

使用Graal js引擎执行js代码

<dependency>

    <groupId>org.graalvm.js</groupId>

    <artifactId>js</artifactId>

    <version>${graal.version}</version>

</dependency>

<dependency>

    <groupId>org.graalvm.js</groupId>

    <artifactId>js-scriptengine</artifactId>

    <version>${graal.version}</version>

</dependency>

import javax.script.ScriptEngine;

import javax.script.ScriptEngineManager;

import javax.script.ScriptException;

public class JsEngineHelloWorld {

    public static void main(String[] args) throws ScriptException {

        ScriptEngine engine = new ScriptEngineManager().getEngineByName("graal.js");

        engine.eval("print('Hello World!');");

    }

}

JS和Java对象交互:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");

Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);

bindings.put("polyglot.js.allowHostAccess", true);

bindings.put("polyglot.js.allowHostClassLookup", (Predicate<String>) s -> true);

bindings.put("javaObj", new Object());

engine.eval("(javaObj instanceof Java.type('java.lang.Object'));"); // it will not work without allowHostAccess and allowHostClassLookup

平台JS脚本能力建设

当平台需要面对复杂、多变的业务时,基于成熟的领域模型和脚本能力能提供灵活的扩展性,可以考虑从以下层面建立平台脚本能力:

执行引擎层:Graal JS、 Nashorn

平台JS引擎:基于底层引擎平台封装。

  1. 引擎启动和关闭管理。
  2. 多线程(并发): 如使用线程池并发执行脚本。
  3. 监控及运营环境管理:如资源管控和限制。
  4. 基础能力注入(提供JS API): 提供机制插入基础能力至JS环境

创建Java对象代理并注入

JS服务层

  1. 基础JS能力: 基于平台产品能力提供JS能力。基于JS引擎的对象绑定功能,提供公共及Java开发的JS对象能力。
  2. 统一的JS执行API: 如统一的API接口
  3. 应用层JS脚本管理。
  4. 基础能力注入(提供JS API): 提供机制插入基础能力至JS环境。

//加载静态资源

Resource[] otherResources =

 (new PathMatchingResourcePatternResolver()).getResources("classpath*:*.js");

List<String> jsResources = (List)Arrays.stream(otherResources).map((x) -> {

    try {

        return IOUtils.toString(x.getInputStream(), StandardCharsets.UTF_8);

    } catch (IOException var2) {

        throw new IllegalArgumentException(x.getFilename() + "load failed ");

    }

}).collect(Collectors.toList());

String staticSource = String.join("\n", jsResources);

//初始化静态脚本

context.eval(staticSource);

//提供特定接口用于提供增加能力对象(pluginClass)

Enhancer enhancer = new Enhancer();

enhancer.setSuperclass(pluginClass);

enhancer.setCallback(interceptor);

T insertObject = enhancer.create();

private static final TypeLiteral<Map<String, Object>> STRING_MAP = new TypeLiteral<Map<String, Object>>() {};

map = (Map)this.context.eval(Source.newBuilder("js", "this", "internal-script").internal(internal).buildLiteral()).as(STRING_MAP);

//特定标识插入JS引用对象

map.put("XXXX", insertObject)

应用JS

  1. 应用JS脚本开发

应用场景

基于业务模型数据经常需要开发特定数据发分析, 对于大数据场景可以使用大数据技术来进行数据挖掘和分析, 对于短周期或小批量的数据,基于灵活多变规则的实时分析可以考虑使用JS脚本来解决规则多变的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1041057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务接口调用OpenFeign_日志增强

OpenFeign虽然提供了日志增强功能&#xff0c;但是默认是不显示任何日志的&#xff0c;不过开发者在调试阶段可以自己配置日志的级别。 OpenFeign的日志级别如下&#xff1a; NONE&#xff1a;默认的&#xff0c;不显示任何日志;BASIC&#xff1a;仅记录请求方法、URL、响应状…

CMU15-213 课程笔记 04-Floating Point

文章目录 浮点数如何用二进制表示IEEE 浮点数标准IEEE 浮点数实现IEEE 浮点数在内存里 E exp - bias 计算指数M 1.xxx 尾数计算举例&#xff1a;对一个浮点数进行转换一些关于浮点数的计算等等 浮点数如何用二进制表示 计算机内部的浮点数不是这样存在内存里的&#xff08;至…

解决vs2022项目文件夹内.vs文件夹容量虚高问题

打开系统显示隐藏文件夹 会在vs2022的项目文件夹内有一个.vs文件夹 在子目录里会有一个Browse.VC.db文件,我的项目代码只有120m,而这个db文件居然有70m 而且每次打开vs项目,会使这个文件发生容量变化,如果你的git项目恰好包含这个.vs文件夹,那就比较不爽了,每次都要更新这个文件…

Python中的设计模式 -- 单例

迷途小书童 读完需要 2分钟 速读仅需 1 分钟 当我们谈到单例模式时&#xff0c;可以想象一个非常特殊的餐厅&#xff0c;这个餐厅只有一个桌子&#xff0c;无论多少人来用餐&#xff0c;都只能坐在这个桌子上。这个桌子就是餐厅的单例&#xff0c;它保证了整个餐厅中只有一个桌…

数据结构学习笔记——查找算法中的树形查找(平衡二叉树)

目录 一、平衡二叉树的定义二、平衡因子三、平衡二叉树的插入和构造&#xff08;一&#xff09;LL型旋转&#xff08;二&#xff09;LR型旋转&#xff08;三&#xff09;RR型旋转&#xff08;四&#xff09;RL型旋转 四、平衡二叉树的删除&#xff08;一&#xff09;叶子结点&a…

进行 XSS 攻击 和 如何防御

跨站脚本攻击&#xff08;XSS 攻击&#xff09;是 Web 开发中最危险的攻击之一。以下是它们的工作原理以及防御方法。 XSS 攻击 跨站脚本攻击就是在另一个用户的计算机上运行带有恶意的 JS 代码。假如我们的程序没有对这些恶意的脚本进行防御的话&#xff0c;他们就会由我们的…

【刷题笔记9.25】LeetCode:相交链表

LeetCode&#xff1a;相交链表 一、题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 二、分析及代码 方法一&#xff1a;使用哈希Set集合 &#xff08;注意…

安装ipfs-swarm-key-gen

安装ipfs-swarm-key-gen Linux安装go解释器安装ipfs-swarm-key-gen Linux安装go解释器 https://blog.csdn.net/omaidb/article/details/133180749 安装ipfs-swarm-key-gen # 编译ipfs-swarm-key-gen二进制文件 go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm…

机器学习(19)---神经网络详解

神经网络 一、神经网络概述1.1 神经元模型1.2 激活函数 二、感知机2.1 概述2.2 实现逻辑运算2.3 多层感知机 三、神经网络3.1 工作原理3.2 前向传播3.3 Tensorflow实战演示3.3.1 导入数据集查看3.3.2 数据预处理3.3.3 建立模型3.3.4 评估模型 四、反向传播五、例题5.1 题15.2 题…

Qt/C++音视频开发56-udp推流和拉流/组播和单播推流

一、前言 之前已经实现了rtsp/rtmp推流&#xff0c;rtsp/rtmp/hls/flv/ws-flv/webrtc等拉流&#xff0c;这种一般都需要依赖一个独立的流媒体服务程序&#xff0c;有没有一种更便捷的方式不需要这种依赖&#xff0c;然后又能实现推拉流呢&#xff0c;当然有的那就是udpp推流&a…

Linux DataEase数据可视化分析工具结合cpolar实现远程访问

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

2023-油猴(Tampermonkey)脚本推荐

2023-油猴&#xff08;Tampermonkey&#xff09;脚本推荐 知乎增强 链接 https://github.com/XIU2/UserScript https://greasyfork.org/zh-CN/scripts/419081 介绍 移除登录弹窗、屏蔽首页视频、默认收起回答、快捷收起回答/评论&#xff08;左键两侧&#xff09;、快捷回…

HTML+CSS综合案例二:CSS简介

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title> CSS简介</title><style>h1{color: #33…

Linux安装Mysql主从集群(图文解说详细版)

MySQL主从集群是一种数据库架构模式&#xff0c;由一个主数据库&#xff08;Master&#xff09;和多个从数据库&#xff08;Slave&#xff09;组成。在主从集群中&#xff0c;主数据库负责处理写操作&#xff08;如插入、更新、删除&#xff09;&#xff0c;而从数据库则用于读…

蓝桥杯每日一题2023.9.23

4961. 整数删除 - AcWing题库 题目描述 分析 注&#xff1a;如果要进行大量的删除操作可以使用链表 动态求最小值使用堆&#xff0c;每次从堆中取出最小值的下标然后在链表中删除 注意long long 代码解释&#xff1a; while(k --){auto t q.top();q.pop();res t.first;i…

【二分图染色】ARC 165 C

C - Social Distance on Graph 题意&#xff1a; 思路&#xff1a; 首先考虑一条链的情况&#xff0c;注意到如果两条相邻的边加起来 < x&#xff0c;一定不行 这个结论推广到图也是一样的 同时注意到 x 具有单调性&#xff0c;考虑对 x 二分 在check时进行二分图染色 …

Linux知识点 -- 网络基础 -- 传输层

Linux知识点 – 网络基础 – 传输层 文章目录 Linux知识点 -- 网络基础 -- 传输层一、传输层协议1.端口号2.网络相关bash命令 二、UDP协议1.UDP报文的解包与交付2.理解UDP报文3.UDP协议的特点4.UDP应用层IO类接口5.UDP的缓冲区6.UDP使用注意事项7.基于UDP的应用层协议 三、TCP协…

SpringMVC 学习(二)Hello SpringMVC

3. Hello SpringMVC (1) 新建 maven 模块 springmvc-02-hellomvc (2) 确认依赖的导入 (3) 配置 web.xml <!--web/WEB-INF/web.xml--> <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee…

简述信息论与采样定理

信息论 香农信息论发表于1948/1949年&#xff0c;它由三部分组成&#xff1a;信号采样、信源编码、信道编码&#xff1b; 信号采样&#xff1a;采样理论研究在何种条件下对连续信号进行采样&#xff0c;从而得到的离散型号可以可逆地恢复出采样前的连续信号。采样得到的离散实…

网络安全--防火墙旁挂部署方式和高可靠性技术

目录 一、防火墙 二、防火墙旁挂部署方式 使用策略路由实现 第一步、IP地址配置 第二步、配置路由 第三步、在防火墙上做策略 第四步、在R2上使用策略路由引流 三、防火墙高可靠性技术--HRP 拓扑图 第一步、配置SW1、SW2、FW1、FW2 第二步、进入防火墙Web页面进行配…