序
一点一点靠近你,在了解新动向过程中,你会发现java还很年轻,还很有活力,还在追求,也许有天依然会重回霸主位置。比如你去了解下GraalVM,它不是什么无中生有的新玩意,但是你看它背后的加持,你会激动不已。
- 官网:https://www.graalvm.org/
- 背书组织:基本3大巨头都为它背书,oracle、spring、eclipse
- 有多强&能干啥:https://baijiahao.baidu.com/s?id=1709080667810830871&wfr=spider&for=pc
知道它在一点点强大,我做不到让它更强大,那我至少应该有用它的勇气吧。
任何脱离场景的技术都是无用的,这是我的观点。所以我站在我的工作位置,结合业务场景,用它可以做我们行业内的设备接入、指令下行、数据上行、自定义暴露等等。
依赖引入
org.eclipse.dirigible dirigible-engine-javascript-graalvm 6.1.6
这个包里的依赖引入就有graalVM,那是基底,可以点击骨架进去看具体依赖。这里我是试试js的执行引入,设想是暴露一个js入口给用户自定义,js是存文件还是方法片段存数据库,自行根据业务需要处理。今天这里我不分享思路,只验证可行性。
测试代码
@Test
void jsFunExecuteTest() {
System.out.println("--GraalVM的js调用传参测试--");
String dataStr = "{n" +
" "upPacketSN": "-1",n" +
" "deviceType": "",n" +
" "productId": "15093884",n" +
" "IMEI": "868913054378877",n" +
" "deviceId": "915b36e0f521453db77c04ec7d596806",n" +
" "protocol": "lwm2m",n" +
" "messageType": "dataReport",n" +
" "payload": "{\"gnss_time\":1637904695000,\"gnss_source\":1,\"cell_id\":149920338,\"gnss_data\":\"$GNRMC,053131.000,A,3028.31259,N,11419.04293,E,0.00,176.43,261121,,,A,V*0A\"}",n" +
" "assocAssetId": "",n" +
" "tenantId": "2000028028",n" +
" "IMSI": "460113182238259",n" +
" "topic": "v1/up/ad19",n" +
" "upDataSN": "-1",n" +
" "serviceId": "11",n" +
" "timestamp": "1637906446220"n" +
"}";
//js方法字符串
String funStr = "n" +
"function testGraalFun(dataStr) {n" +
" var parseResult = {};n" +
" parseResult.language = "js";n" +
" parseResult.protocol = "nbiot";n" +
" parseResult.method = "testGraalFun";n" +
" var dataArr = new Array();n" +
" if (dataStr != null && dataStr != "") {n" +
" var re = JSON.parse(dataStr);n" +
" Object.keys(re).forEach(function(k) {n" +
" var tmp = {};n" +
" tmp.enName = k;n" +
" tmp.cnName = "";n" +
" tmp.keyVal = re[k];n" +
" switch (k) {n" +
" case "upPacketSN":n" +
" tmp.cnName = "上行包序号";n" +
" break;n" +
" case "deviceType":n" +
" tmp.cnName = "设备类型";n" +
" break;n" +
" case "productId":n" +
" tmp.cnName = "商品ID";n" +
" break;n" +
" case "deviceId":n" +
" tmp.cnName = "设备编码";n" +
" break;n" +
" default:n" +
" break;n" +
" }n" +
" dataArr.push(tmp);n" +
" });n" +
" }n" +
" if (dataArr.length > 0){n" +
" parseResult.data = dataArr;n" +
" return JSON.stringify(parseResult);n" +
" }n" +
" return parseResult;n" +
"}";
Context context = Context.newBuilder()
.allowHostAccess(HostAccess.ALL)
.allowHostClassLookup(s -> false)
.build();
context.eval(Source.create("js", funStr));
//java通过graalvm调用并传参执行,返回结果
Object obj = context.getBindings("js").getMember("testGraalFun").execute(dataStr);
System.out.println("-----解析结果:" + obj.toString());
}
测试类执行结果
其他编程语言各位可以勇敢的试试,你会发现多么的迷人,性能还特别高。以前也做过类似java调用dll文件之类的,那时候还会有好多限制,要语言指令转换包什么的。现在有了它,不得不说真香,而且未来绝对可期,说不定有一天它能重回霸主位。
它还在不断迭代优化,oracle在积极推动,吸引大家换高版本的jdk,说不定有天你就是因为迷上了它。
能用它干啥,这里至少抛砖引玉,大家大胆的自行fly your self。



