Node.js調(diào)用java之node-java問題
故事的起源是這樣:
項目中用ioredis封裝的模塊,在定時、大數(shù)據(jù)量寫入redis的情況下,內(nèi)存激增,如果不是我對ioredis使用姿勢有問題的話,那么就是在這種苛刻的情況下,node招架不住了,然后自然想到了jedis,官方推薦的redis的java客戶端,大廠、線上都在大量使用,生態(tài)也非常的好。
對于我們要在node中調(diào)用java,則基本需求是
(1)、java封裝接口,到處jar,node調(diào)用jar中的接口,傳參拿值;
(2)另一種比較少用,因為通用性不強,node中chilld_process運行jar包,當(dāng)然jar中需要有java主函數(shù),然后就在另一個線程中運行起來了,就沒node什么事情了。
本文主要講的是第一種需求,因為這才是通用的使用方法。
1、環(huán)境搭建
nodejs基本環(huán)境是自然的了。
(1)安裝java(jdk、jre),自行百度,并配置環(huán)境變量;
(2)安裝python2版本;
(3)全局安裝node-gyp;
npm/cnpm i -g node-gyp
(4)全局安裝window-build-tools;(由于下載下來的模塊需要編譯,所以需要這個工具,如果你本身安裝了vs,就不需要這個東西,能自動檢測到)
npm i --g --production windows-build-tools
(5)安裝node-java模塊;
雖然叫node-java,但模塊本身是java
cnpm i java
如果(1)~(3)你都配置好了,然后在vscode中運行npm i java時還是出錯的話,良好的建議,打開控制臺運行,vscode可能存在一些權(quán)限問題,至少我遇見過這樣的事情,然后按照這種方法就成功了。
2、導(dǎo)出jar包
我使用的時idea,其實各種ide都一個樣,都能搞,這里說一下基本步驟:
(1)創(chuàng)建一個java project
(2) 導(dǎo)入相關(guān)jar包(Jedis為例)
新建一個jar文件夾,將jars放進去,然后導(dǎo)入項目;
導(dǎo)入jar,點擊項目結(jié)構(gòu)進入
然后選擇剛剛放置好的jars,點擊勾選,確認(rèn)即可
然后可以開發(fā)接口了,這里簡單一個寫入redis的接口
package com.company; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.Pipeline; public class JedisTool { private Pipeline pl = null; private JedisPoolConfig poolConfig = null; private Jedis jr = null; private JedisPool jedisPool = null; public void initJedis() { this.poolConfig = new JedisPoolConfig(); // 最大連接數(shù) this.poolConfig.setMaxTotal(4); // 最大空閑數(shù) this.poolConfig.setMaxIdle(1); // 最大允許等待時間 this.poolConfig.setMaxWaitMillis(2000); //獲得連接池 this.jedisPool = new JedisPool(poolConfig,"127.0.0.1",6379); this.jr = this.jedisPool.getResource(); this.pl = this.jr.pipelined(); } public void usePipeline(int count) { try{ for(int i=0;i<count;i++) { this.pl.set("abcdefgh" + Integer.toString(i), "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" + Integer.toString(i)); } this.pl.sync(); }catch (Exception e){ e.printStackTrace(); }finally { } } public Jedis getClient(){ return this.jedisPool.getResource(); } }
接下來點擊項目結(jié)構(gòu)--》Artifact,點擊左上加號--》form modules with dependencies
填寫主類,這里改成接口類也是可以的(手動改,無法選擇接口類)、點擊完成、然后點擊build--》build artifacts--》build
然后再項目中的out文件夾就生成了jar包。
3、nodejs調(diào)用jar
直接看代碼吧,這里只是很簡單的,但很實用。
let java = require("java"); //引入nodejs的java模塊 java.classpath.push("./testJedis.jar"); //導(dǎo)入編寫的jar包 let JedisTool = java.import('com.company.JedisTool'); //package.class let jedisTool = new JedisTool(); jedisTool.initJedis(); //方法調(diào)用 setInterval(() => { jedisTool.usePipeline(100000); }, 1000);
還有很多使用方法,這里不一一列出了,有了node的java模塊,你也可以在node中進行java開發(fā)了。
node-java文檔 ,官方文檔很詳細,我雖然英語好,但是也是實在讀不下去,挑自己感興趣的學(xué)習(xí)即可。
4、心得
本文簡單記錄了node調(diào)用java的方法,在生產(chǎn)項目中會增加許多可能,因為優(yōu)秀的接口我們都值得使用,不管他是java還是c++。
這個過程中有幾點注意事項:
(1)java模塊的依賴問題,換臺電腦還能不能用之類的事情,最起碼要運行的機器需要java環(huán)境;
(2)高版本編譯的jar,裝有低版本java的node調(diào)用jar會報錯;
(3)openJDK能否正常調(diào)用等待明天驗證;
(4)jar不能在nodejs的多線程使用,這個問題有待研究。
5、后續(xù)驗證
(1)java模塊的依賴問題,換臺電腦還能不能用之類的事情,最起碼要運行的機器需要java環(huán)境;
這一點在其他機器上(windows)只需要安裝同版本的java環(huán)境,并且將jvm.dll的路徑添加到環(huán)境變量path中即可。
(2)openJDK能否正常調(diào)用(可以);
由于nodejs安裝java模塊的時候需要編譯且生唉成了一個.node,而.node并不跨平臺,所以需要重新編譯,在linux下使用java模塊同樣需要編譯(java、javac、node-gyp,g++...)。
但是linux有些系統(tǒng)只安裝了java,并沒有安裝javac,所以需要安裝javac,重新編譯java模塊源碼。
然后就可以愉快的使用了。
(3)開啟多線程,只能有一個線程運行我們封裝的jar包;
經(jīng)過驗證,確實如此,查看官網(wǎng),說是只能創(chuàng)建一個jvm,線程同屬于一個進程,所以之。
突然又會想到,那多進程呢,理論上是可以的,驗證之后確實如此,進程之間相互隔離,所以可以創(chuàng)建多個jvm。
6、補充
中標(biāo)麒麟下運行node調(diào)用java的注意事項
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
node.js學(xué)習(xí)筆記之koa框架和簡單爬蟲練習(xí)
這篇文章主要介紹了node.js學(xué)習(xí)筆記之koa框架和簡單爬蟲練習(xí),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12詳解Node.js項目APM監(jiān)控之New Relic
本篇文章主要介紹了Node.js項目APM監(jiān)控之New Relic,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05詳解如何使用node.js的開發(fā)框架express創(chuàng)建一個web應(yīng)用
這篇文章主要介紹了詳解如何使用node.js的開發(fā)框架express創(chuàng)建一個web應(yīng)用,網(wǎng)上各種搜索后,整理了下快速搭建express框架的步驟。非常具有實用價值,需要的朋友可以參考下2018-12-12Linux系統(tǒng)中如何下載、解壓和安裝特定版本的Node.js
Nodejs版本坑眾多,不同應(yīng)用可能需要不同版本,下面這篇文章主要給大家介紹了關(guān)于Linux系統(tǒng)中如何下載、解壓和安裝特定版本的Node.js的相關(guān)資料,需要的朋友可以參考下2024-01-01Node.js、Socket.IO和GPT-4構(gòu)建AI聊天機器人的項目實踐
本文主要介紹了Node.js、Socket.IO和GPT-4構(gòu)建AI聊天機器人的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05關(guān)于NodeJs和JAVA建立socket連接方式
這篇文章主要介紹了關(guān)于NodeJs和JAVA建立socket連接方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06解決nodejs報錯Error:EPERM:operation not permitted,mkdi
這篇文章主要介紹了解決nodejs報錯Error:EPERM:operation not permitted,mkdir‘xxxxxxxxxxxxxxxx‘問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02