当前位置:Java -> AnyLang: 一种轻量级、多脚本解决方案
尽管我们建议读者通过作者的之前的文章来了解本文背后的动机,但是我们在这里简要介绍一下。业务规则及其管理对于企业应用程序至关重要。业务规则可以被视为决策产生的行动,大多数情况下是描述业务运行方式的条件分支(IF-ELSE)。尽管已经有许多免费和付费的解决方案,比如JRule、IBM Drools、Blaze(FICO)、Oracle Rules SDK等,这些解决方案已经具备了高度复杂的功能,但它们的许可证和维护往往会成为一种长期负担,特别是当产品被未充分利用时。如今,由于微服务的普及,开发团队往往规模较小,一个成员可能要担任多个角色。因此,编写和维护规则和规则引擎可能会由不同的成员和团队来完成。
业务规则引擎具有各自的学习曲线,而且在团队中很难总是有一个具备正确技能的人专门负责管理BRMS。为了填补这一差距,我们需要灵活地使用不同的编程语言,至少是一些常用的编程语言。本文将阐述如何通过一个低成本、轻量级的解决方案来提供这种灵活性,以便使用自己选择的编程语言来创建规则(目前已支持Java、JavaScript和Python)。它还有助于抽象规则的存储,这几乎可以在任何地方进行 —— 从本地文件系统到云存储、数据库、CMS等。
对于开源贡献者来说,它提供了为新的编程语言和存储与安全策略提供支持的机会。在撰写本文时,已支持Java、JavaScript和Python。因此,它可以无缝地被后端、前端和数据/分析工程师所使用。至今,支持的存储方式包括本地文件存储、非响应式流、用于SQL+ NoSQL数据库的JDBC/JPA、云服务,比如AWS S3 bucket、Azure Blob和FS。
尽管ScriptEngines已经存在了相当长的时间,但它们在开发人员中相对较少见。本节试图简要介绍如何在Java中以编程方式调用JavaScript函数。 在我们讨论ScriptEngines的同时,我们将简化它;使示例符合Java SE 1.8的规范。要深入探讨这个话题,可以查阅互联网上的有关资料。 假设我们有以下JavaScript函数,someJSAddFunction
存储在本地存储的文件a.js中,需要通过Java程序执行该函数。下面的代码片段说明了如何实现这一目标:
/* A simple function which takes an array of numbers and returns their sum. */
function someJSAddFunction (arr){
var sum=0;
for(var x in arr){
print(x);
sum=sum+arr[x];
}
return sum;
}
public static void main(String[] args) throws FileNotFoundException, ScriptException, NoSuchMethodException {
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("nashorn"); // Get // an instance of ScriptEngine
Object eval = scriptEngine.eval(
new FileReader( new File("path/subPath/a.js") )
); // read JavaScript from file
Invocable invocable=(Invocable)scriptEngine;
Object r = invocable.invokeFunction("someJSAddFunction", new int[] {1,2,3,4,5}); // Invoke //the method by method name, passing argument
System.out.println("Result of JS execution is "+r);
}
存储在本地存储的文件 a.js 中,需要通过Java程序执行该函数。下面的代码片段说明了如何实现以上目标。
下面得到了如下输出:
要了解更多内容和深入探讨,可以参考这篇文章或其他在线或离线材料。
在近年来与之合作的团队中,我们发现新的开发人员更倾向于、并且可能更熟悉JavaScript和JavaScript框架,比如Angular、Node、React等,而不是Java。不论JavaScript与Java作为永恒辩论话题,我们的主要观点是作为开发人员起步然后转向成为业务分析师或执行领域相关角色的人更熟悉JavaScript;至少他们似乎保留了一些开发者的特质。 在先前使用Java方法、函数和Lambda代码片段来定义规则的轻量级规则引擎的有效性之后,我们对采用JavaScript也产生了兴趣。
function getDiscount(customerDto){
var age= customerDto.age;
if(age < 12) return 0.4; // 40% discount below 12 years
if(age < 16) return 0.25 // 25% discount for 12 years or above but below 16 years
return 0.15; // for 16 or above, 15% discount
}
在撰写本文时,我们支持以下代码片段中显示的来源来加载脚本。由于脚本的加载可能是与实现相关的,我们提供了以下工厂方法来获取[图. 4]所示的适当加载器。
如果我们要添加对新源的支持,比如Azure存储、GitHub或JIRA,我们需要:
我们认为以下将是最简单的示例,下面的代码用于从本地文件系统加载脚本。
脚本层次结构如下:
然而,本节仅涵盖JavaScript,下一节将详细展示如何添加对Python的支持。这将是开发人员社区的快速参考指南,希望扩展它并为其他编程语言引入新功能和支持。
推荐阅读: 程序员这个职业能干多久
本文链接: AnyLang: 一种轻量级、多脚本解决方案