`

Java引擎调用实例

    博客分类:
  • java
 
阅读更多

最近做项目时遇到项目间相互调用的功能,开始打算用webservice来解决,但是考虑到性能问题已经时间等待问题,最终还是决定通过Java公式调用方式解决,一下为部分调用代码

package seentao.imp.formula;

import static test.imp.formula.FormulaExecTypeEnum.JAVA_METHOD;
import static test.imp.formula.FormulaExecTypeEnum.JS_SCRIPT;
import static test.imp.formula.FormulaExecTypeEnum.SQL_CAUSE;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.mozilla.javascript.Context;
import org.mozilla.javascript.ScriptableObject;

public class FormulaInvoker {
	
	private Context cx;
	private ScriptableObject scope;
	private SimpleDateFormat dateFmt;
	private boolean reInit = true;
	private FormulaVO[] fmlVOs;
	
	private static final String JAVA_METHOD_NAME_KEY = "invokeJavaMethod"; 
	private static final String SQL_CAUSE_NAME_KEY = "invokeSqlCause"; 
	private static final String JAVA_SCRIPT_NAME_KEY = "invokeJavaScript"; 
	
	public void setFmlVOs(FormulaVO[] fmlVOs) {
		this.fmlVOs = fmlVOs;
	}
	
	public void init() {
		if (reInit) {
			cx = Context.enter();
			scope = cx.initStandardObjects();
			dateFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			for (FormulaVO vo : fmlVOs) {
				String source = null;
				if (JAVA_METHOD.equals(vo.getExec_type())) {
					source = createScriptSource(vo.getFunc_name(), JAVA_METHOD_NAME_KEY, vo.getFml_code());
				} else if (SQL_CAUSE.equals(vo.getExec_type())) {
					source = createScriptSource(vo.getFunc_name(), SQL_CAUSE_NAME_KEY, vo.getFml_code());
				} else if (JS_SCRIPT.equals(vo.getExec_type())) {
					source = createScriptSource(vo.getFunc_name(), JAVA_SCRIPT_NAME_KEY, vo.getFml_code());
				}
				cx.evaluateString(scope, source, "", 0, null);
			}
			reInit = false;
		}
	}
	
	public void reset() {
		reInit = true;
	}
	
	public Object invoke(FormulaVO fmlVO, Map<String, Object> params) {
		if (params == null) {
			params = new HashMap<String, Object>();
		}
		
		// 注入参数
		for (Entry<String, Object> entry : params.entrySet()) {
			scope.put(entry.getKey(), scope, entry.getValue());
		}

		// 执行脚本函数
		String funcExp = String.format("'' + %s", fmlVO.getFunc_name());
//可以直接得到调用项目的结果
		Object result = cx.evaluateString(scope, funcExp, "", 0, null);

		// 清除参数
		for (Entry<String, Object> entry : params.entrySet()) {
			scope.delete(entry.getKey());
		}

		// 处理结果
		String returnType = fmlVO.getReturn_type();
		try {
			if (FormulaReturnType.BOOLEAN.equals(returnType)) {
				return "true".equals(result);
			} else if (FormulaReturnType.BYTE.equals(returnType)) {
				return Byte.parseByte(result.toString());
			} else if (FormulaReturnType.SHORT.equals(returnType)) {
				return Short.parseShort(result.toString());
			} else if (FormulaReturnType.INTEGER.equals(returnType)) {
				return Integer.parseInt(result.toString());
			} else if (FormulaReturnType.LONG.equals(returnType)) {
				return Long.parseLong(result.toString());
			} else if (FormulaReturnType.FLOAT.equals(returnType)) {
				return Float.parseFloat(result.toString());
			} else if (FormulaReturnType.DOUBLE.equals(returnType)) {
				return Double.parseDouble(result.toString());
			} else if (FormulaReturnType.STRING.equals(returnType)) {
				return result.toString();
			} else if (FormulaReturnType.DATE.equals(returnType)) {
				return dateFmt.parse((String) result);
			} else if (FormulaReturnType.ARRAY.equals(returnType)) {
				return result.toString();
			} else if (FormulaReturnType.TWO_DIM_ARRAY.equals(returnType)) {
				return result.toString();
			} else {
				return result;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return e.getMessage();
		}
	}
	
	public void exit() {
		Context.exit();
	}
	
	private String createScriptSource(String funcName, String methodName, String code) {
		code = code.replaceAll("\"", "\\\\\"");
		if (JAVA_SCRIPT_NAME_KEY.equals(methodName)) {
			return createScriptSource(funcName, code);
		} else {
			if (SQL_CAUSE_NAME_KEY.equals(methodName)) {
				code = code.trim();
				if (code.indexOf("\\n") > 0) {
					code = code.replaceAll("\\n", "");
				}
			}
			String source = String.format("function %s {%n" +
					"\treturn Packages.seentao.imp.formula.FormulaProxy.%s(\"%s\", arguments);%n" +
			"}%n", funcName, methodName, code);
			return source;
		}
	}
	
	private String createScriptSource(String funcName, String code) {
		code = code.indexOf("return ")>=0 ? code : "return " + code;
		return String.format("function %s {try{%s;}catch(e){return e;}}%n", funcName, code);
	}
	
}

  关于Java引擎可参见:

http://blog.csdn.net/zhengyuanting/article/details/2973972
分享到:
评论

相关推荐

    Java调用ILOG规则集的两种实现

    两种方式实现java调用ILOG规则集。

    JAVA上百实例源码以及开源项目源代码

    摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,...

    java源码包---java 源码 大量 实例

    摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,...

    JAVA上百实例源码以及开源项目

    摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,...

    Java调用浏览器打开网页完整实例

    主要介绍了Java调用浏览器打开网页的方法,以完整实例形式分析了java打开网页的相关技巧,需要的朋友可以参考下

    java源码包4

    摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络...

    java源码包3

    摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络...

    java源码包2

    摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络...

    PHP调用JAVA的WebService简单实例

    使用PHP调用JAVA语言开发的WebService。客户端提交两个String类型的参数,服务端返回一个对象类型。服务端使用AXIS-1.4作为SOAP引擎。客户端为PHP5.2.9,使用NuSOAP作为SOAP引擎。 服务端 对象类复制代码 代码如下:...

    java开源包1

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    Java 2D游戏引擎 EagleEngine-3.x

    该工程是基于Java平台开发的一款2D游戏引擎(升级款),其内包含了 内核、渲染、动画、音效、UI、交互、物理、寻路等模块。引擎将碰撞检测等算法集成,开发者只需调用接口即可。作者的资源中亦有基于引擎的实例,欢迎...

    c# asp.net 在后台使用谷歌V8引擎执行js

    c# 、asp.net 在后台使用谷歌V8引擎执行js,将示例工程中的GoogleV8Engine.cs文件复制到你的项目中。将GoogleV8Engine_x64.dll 和 GoogleV8Engine_x86.dll 两个非托管DLL...JavascriptEngine类中有下列方法可供你调用

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的...

    ajax调用java实例源码-jaxrsbars:jaxrsbars

    ajax调用java实例源码带有 JAX-RS、MongoDB、JSON 和 jQuery 的现代 Web 应用程序 我们正处于范式转变之中,这将极大地改变我们构建和部署软件的人数。 90 年代后期,软件开始转向网络,网络浏览器的流行为用户提供...

    基于JAVA的搜索引擎 lucene-2.2.0

    Exception in thread "main" java.io.FileNotFoundException: no segments* file found in org.apache.lucene.store.FSDirectory@E:\index: files: at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run...

    java开源包6

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    java开源包4

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

Global site tag (gtag.js) - Google Analytics