Node.js調(diào)用java之node-java問(wèn)題
故事的起源是這樣:
項(xiàng)目中用ioredis封裝的模塊,在定時(shí)、大數(shù)據(jù)量寫入redis的情況下,內(nèi)存激增,如果不是我對(duì)ioredis使用姿勢(shì)有問(wèn)題的話,那么就是在這種苛刻的情況下,node招架不住了,然后自然想到了jedis,官方推薦的redis的java客戶端,大廠、線上都在大量使用,生態(tài)也非常的好。
對(duì)于我們要在node中調(diào)用java,則基本需求是
(1)、java封裝接口,到處jar,node調(diào)用jar中的接口,傳參拿值;
(2)另一種比較少用,因?yàn)橥ㄓ眯圆粡?qiáng),node中chilld_process運(yùn)行jar包,當(dāng)然jar中需要有java主函數(shù),然后就在另一個(gè)線程中運(yùn)行起來(lái)了,就沒(méi)node什么事情了。
本文主要講的是第一種需求,因?yàn)檫@才是通用的使用方法。
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;(由于下載下來(lái)的模塊需要編譯,所以需要這個(gè)工具,如果你本身安裝了vs,就不需要這個(gè)東西,能自動(dòng)檢測(cè)到)
npm i --g --production windows-build-tools
(5)安裝node-java模塊;
雖然叫node-java,但模塊本身是java
cnpm i java
如果(1)~(3)你都配置好了,然后在vscode中運(yùn)行npm i java時(shí)還是出錯(cuò)的話,良好的建議,打開(kāi)控制臺(tái)運(yùn)行,vscode可能存在一些權(quán)限問(wèn)題,至少我遇見(jiàn)過(guò)這樣的事情,然后按照這種方法就成功了。
2、導(dǎo)出jar包
我使用的時(shí)idea,其實(shí)各種ide都一個(gè)樣,都能搞,這里說(shuō)一下基本步驟:
(1)創(chuàng)建一個(gè)java project

(2) 導(dǎo)入相關(guān)jar包(Jedis為例)
新建一個(gè)jar文件夾,將jars放進(jìn)去,然后導(dǎo)入項(xiàng)目;

導(dǎo)入jar,點(diǎn)擊項(xiàng)目結(jié)構(gòu)進(jìn)入

然后選擇剛剛放置好的jars,點(diǎn)擊勾選,確認(rèn)即可


然后可以開(kāi)發(fā)接口了,這里簡(jiǎn)單一個(gè)寫入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);
// 最大允許等待時(shí)間
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();
}
}接下來(lái)點(diǎn)擊項(xiàng)目結(jié)構(gòu)--》Artifact,點(diǎn)擊左上加號(hào)--》form modules with dependencies

填寫主類,這里改成接口類也是可以的(手動(dòng)改,無(wú)法選擇接口類)、點(diǎn)擊完成、然后點(diǎn)擊build--》build artifacts--》build



然后再項(xiàng)目中的out文件夾就生成了jar包。
3、nodejs調(diào)用jar
直接看代碼吧,這里只是很簡(jiǎn)單的,但很實(shí)用。
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中進(jìn)行java開(kāi)發(fā)了。
node-java文檔 ,官方文檔很詳細(xì),我雖然英語(yǔ)好,但是也是實(shí)在讀不下去,挑自己感興趣的學(xué)習(xí)即可。
4、心得
本文簡(jiǎn)單記錄了node調(diào)用java的方法,在生產(chǎn)項(xiàng)目中會(huì)增加許多可能,因?yàn)閮?yōu)秀的接口我們都值得使用,不管他是java還是c++。
這個(gè)過(guò)程中有幾點(diǎn)注意事項(xiàng):
(1)java模塊的依賴問(wèn)題,換臺(tái)電腦還能不能用之類的事情,最起碼要運(yùn)行的機(jī)器需要java環(huán)境;
(2)高版本編譯的jar,裝有低版本java的node調(diào)用jar會(huì)報(bào)錯(cuò);
(3)openJDK能否正常調(diào)用等待明天驗(yàn)證;
(4)jar不能在nodejs的多線程使用,這個(gè)問(wèn)題有待研究。
5、后續(xù)驗(yàn)證
(1)java模塊的依賴問(wèn)題,換臺(tái)電腦還能不能用之類的事情,最起碼要運(yùn)行的機(jī)器需要java環(huán)境;
這一點(diǎn)在其他機(jī)器上(windows)只需要安裝同版本的java環(huán)境,并且將jvm.dll的路徑添加到環(huán)境變量path中即可。
(2)openJDK能否正常調(diào)用(可以);
由于nodejs安裝java模塊的時(shí)候需要編譯且生唉成了一個(gè).node,而.node并不跨平臺(tái),所以需要重新編譯,在linux下使用java模塊同樣需要編譯(java、javac、node-gyp,g++...)。
但是linux有些系統(tǒng)只安裝了java,并沒(méi)有安裝javac,所以需要安裝javac,重新編譯java模塊源碼。
然后就可以愉快的使用了。
(3)開(kāi)啟多線程,只能有一個(gè)線程運(yùn)行我們封裝的jar包;
經(jīng)過(guò)驗(yàn)證,確實(shí)如此,查看官網(wǎng),說(shuō)是只能創(chuàng)建一個(gè)jvm,線程同屬于一個(gè)進(jìn)程,所以之。
突然又會(huì)想到,那多進(jìn)程呢,理論上是可以的,驗(yàn)證之后確實(shí)如此,進(jìn)程之間相互隔離,所以可以創(chuàng)建多個(gè)jvm。

6、補(bǔ)充
中標(biāo)麒麟下運(yùn)行node調(diào)用java的注意事項(xiàng)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Node.js實(shí)現(xiàn)用戶身份驗(yàn)證和授權(quán)的示例代碼
在web開(kāi)發(fā)中,我們常常需要對(duì)一些敏感的url進(jìn)行訪問(wèn)權(quán)限控制,本文主要介紹了Node.js實(shí)現(xiàn)用戶身份驗(yàn)證和授權(quán)的示例代碼,具有一定的參考價(jià)值,感興趣的了解一下2024-02-02
手寫Node靜態(tài)資源服務(wù)器的實(shí)現(xiàn)方法
這篇文章主要介紹了手寫Node靜態(tài)資源服務(wù)器的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
淺談Node新版本13.2.0正式支持ES Modules特性
這篇文章主要介紹了淺談Node新版本13.2.0正式支持ES Modules特性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
node.js 使用 net 模塊模擬 websocket 握手進(jìn)行數(shù)據(jù)傳遞操作示例
這篇文章主要介紹了node.js 使用 net 模塊模擬 websocket 握手進(jìn)行數(shù)據(jù)傳遞操作,結(jié)合實(shí)例形式分析了node.js基于net模塊模擬 websocket握手相關(guān)原理及進(jìn)行數(shù)據(jù)傳遞具體操作技巧,需要的朋友可以參考下2020-02-02
詳解PNPM?Monorepo依賴項(xiàng)管理功能模擬實(shí)現(xiàn)
這篇文章主要介紹了PNPM?Monorepo依賴項(xiàng)管理功能模擬實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Nodejs學(xué)習(xí)筆記之測(cè)試驅(qū)動(dòng)
本文是本系列文章的第二篇,主要是測(cè)試針對(duì)于web后端的驅(qū)動(dòng),在開(kāi)發(fā)過(guò)程中,在開(kāi)發(fā)完成一段代碼后如果負(fù)責(zé)任而不是說(shuō)完全把問(wèn)題交給測(cè)試人員去發(fā)現(xiàn)的話,這個(gè)時(shí)候通常都會(huì)去做一些手動(dòng)的測(cè)試。2015-04-04
淺談node如何優(yōu)雅地獲取mac系統(tǒng)版本
這篇文章主要和大家聊聊node如何優(yōu)雅地獲取mac系統(tǒng)版本,文中有詳細(xì)的代碼示例和流程步驟,對(duì)我們學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-06-06
node.js中npm下載依賴包報(bào)錯(cuò)解決步驟詳解
本文給大家介紹node.js中npm下載依賴包報(bào)錯(cuò)解決步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-10-10

