最近做项目时遇到项目间相互调用的功能,开始打算用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源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,...
摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,...
摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,...
主要介绍了Java调用浏览器打开网页的方法,以完整实例形式分析了java打开网页的相关技巧,需要的朋友可以参考下
摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络...
摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络...
摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络...
使用PHP调用JAVA语言开发的WebService。客户端提交两个String类型的参数,服务端返回一个对象类型。服务端使用AXIS-1.4作为SOAP引擎。客户端为PHP5.2.9,使用NuSOAP作为SOAP引擎。 服务端 对象类复制代码 代码如下:...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
该工程是基于Java平台开发的一款2D游戏引擎(升级款),其内包含了 内核、渲染、动画、音效、UI、交互、物理、寻路等模块。引擎将碰撞检测等算法集成,开发者只需调用接口即可。作者的资源中亦有基于引擎的实例,欢迎...
c# 、asp.net 在后台使用谷歌V8引擎执行js,将示例工程中的GoogleV8Engine.cs文件复制到你的项目中。将GoogleV8Engine_x64.dll 和 GoogleV8Engine_x86.dll 两个非托管DLL...JavascriptEngine类中有下列方法可供你调用
浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的...
ajax调用java实例源码带有 JAX-RS、MongoDB、JSON 和 jQuery 的现代 Web 应用程序 我们正处于范式转变之中,这将极大地改变我们构建和部署软件的人数。 90 年代后期,软件开始转向网络,网络浏览器的流行为用户提供...
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...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...