LuaとJavaが相互作用する例

3579 ワード

この例ではJavaファイル、Luaスクリプトファイルを使用し、Apache commonsを参照します.langサードパーティjarパッケージ、luajava.jar、関連jarパッケージは自分でダウンロードしてください.
LuaDemo.java
package com.chilijoy.lua;import java.io.File;import java.util.Queue;import java.util.Random;import java.util.concurrent.ConcurrentLinkedQueue;import org.apache.commons.lang3.RandomStringUtils;import org.keplerproject.luajava.LuaState;import org.keplerproject.luajava.LuaStateFactory;/******************************************************************************* * * LuaDemo.JAva Created on 2014年7月28日**Author:linfenliang**Description:**Version:1.0*************************************************************************/public class LuaDemo{public static final String luaPath="."+File.separator + "conf"+ File.separator ; public static Queue queue = new ConcurrentLinkedQueue(); public static void main(String[] args) { LuaState state = LuaStateFactory.newLuaState(); state.openLibs(); state.LdoFile(luaPath+"demo.lua"); new PublishMessage(state).start(); new SubscribeMessage(queue).start(); }}class PublishMessage extends Thread{ private LuaState state; public PublishMessage(LuaState state) { this.state = state; } @Override public void run(){while(true){String value=RandomStringUtils.randomAlphabetic(32);state.getField(LuaState.LUA_GLOBALSINDEX、「pushDataToQueue」);state.pushString(value);state.call(1,0);try{int time=(int)(new Randoom().nextDouble(*10);time=time>0?time>time>0?time>time?time?time>time 0?time?time?time>time 0?time?time?e:3;System.out.println(「データの書き込み:」+value+「,一時停止」+time+「秒」); Thread.sleep(time*1000); } catch (InterruptedException e) { e.printStackTrace(); } } }}class SubscribeMessage extends Thread{ private Queue queue; public SubscribeMessage(Queue queue) { this.queue = queue; } @Override public void run() { int time = 3; while(true){ try { Thread.sleep(time*1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(time+「秒に1回データを取る:」+this.queue.poll();}}demo.lua
LuaDemo = luajava.bindClass("com.chilijoy.lua.LuaDemo");function pushDataToQueue(data) LuaDemo.queue:offer(data);end印刷結果(例)
書き込みデータ:iQRYgmmsRCKVggBNlCouEsTNLHmhKlHlT、8秒3秒停止1回データ:iQRYgmsRCKVggggBNlCouEsTNLHmhKlHlT 3秒1回データ:null書き込みデータ:YSffHtLxknhgDoIRGzzSoBoqlzzzzSoBoqlzAjResi、6秒3秒停止1回データ:YSffHtLxknhgDoIRGzSoBoqlzAjResi 3秒1回データ:null書き込みデータ:null書き込みデータ:null書き込みデータ:null書き込みデータ:ubiiiiiiiiiiiiikbikbikbJSKwedEhKalsigLvTCVEJEnLRiXN,一時停止3秒3秒1回データ:ubikJS KwedEhKalsigLvTCVEJEnLRiXN書き込みデータ:YRrazjaOHVWZIIbMrBbUgVLLrfSsVWDQm、一時停止4秒3秒1回データ:YRrazjaOHVWZIbMrBBUgVLrfSsVWDQm 3秒1回データ:null書き込みデータ:zhuLoDjSJMpInVVPwmCYkshRtWpLdIPwS、一時停止1秒データ:fnKpyQlszzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzznsEmZHjtDvZDPOpzVHyNTtJ,一時停止8秒3秒1回データ:zhuLoDjSJMpInVPwmCYkshRtWpLdIPwS
まとめ:
LuaとJavaのインタラクション:
Java呼び出しLua:
luajavaを採用する.JArパケットAPI呼び出しはパラメータ伝達を実現する(注意:長くなるパラメータは不可)
Lua呼び出しJava:
(1) luajava.bindClass("package.ClassName");
Java内のオブジェクトを参照して呼び出す(注意:Javaを呼び出すことができない中配列形式、int[]など).
(2)
luajava.newInstance("package.ClassName",parameter);
インスタンス化Java内のオブジェクトを呼び出し、その後、Javaインスタンス化メソッドに複数のパラメータを転送できます.
LuaはJavaにデータを渡し、Javaがクライアントに戻ることができるようにする.この場合、Luaが処理した業務データをJavaオブジェクトを参照することによってJavaのキューに書き込み、Javaはそのキューの完了データの通信(同様にRPC呼び出し)をタイミングよく読み取ることができる.
この方式の呼び出しには一定の遅延があり、Luaが業務データを処理する過程で、すべての業務が処理を完了してからJava処理に戻るのを待つことなく、異なるデータを異なるキューに書き込むことができるという利点がある.もう1つの方法は、すべてのビジネスロジックがLuaで処理を完了するまで待つことであり、
luajavaでJArパケットの提供するAPIは、Luaがデータ処理を完了した直後に戻り結果を受信し、次のデータ処理を行うことができるが、Luaがデータ処理に時間がかかると、ここで長時間のブロック待ちが発生し、自分で選択を吟味する.