我的企业应用程序目前正在运行Weblogic 10.3.4,Java 1.6和Spring 2.0.8。这是最近的升级,因此Spring尚未更新,而且一些java代码库仍然是旧的1.4风格。
目前我们使用专有规则引擎来运行我们的业务规则。但是,由于我们没有使用任何推理引擎功能,因此我们无法再证明许可证成本,因此这样做太过分了。计划是编写一个数据库驱动的规则引擎。
每个表单请求都有与之关联的任意数量的规则,这些规则可以使用一些基本的数据库表进行配置。
到目前为止,我的设计是数据库中定义的每个规则都将通过Spring映射到Singleton Stateless Spring bean。给定一个表单状态,每个规则将返回一个Result respose对象。请参阅下面的代码段:
//get List of rules for form from database
List<RuleConfiguration> rules = RulesService.getRulesForFormRuleset(formType, filingMethod, rsName, document);
IssueDocument issues = new IssueDocumentImpl();
for (RuleConfiguration ruleConfig : rules) {
//create a rule instance from the Spring Bean Factory
Rule rule = (Rule) beanFactory.getBean(ruleConfig.getRule().getRuleBeanName());
RulesIssue issue = rule.runRule(document, ruleConfig);
if (issue != null) { //Issue has been populated rule must have fired
issues.addNewIssue(issue);
}
}
return issues;
这听起来像是一个明智的解决方案吗?我热衷于实现一种“轻触”解决方案,因此避开了EJB,因为最终必须编写500多条规则。我主要担心的是,由于这些都是单身,而且我的“规则引擎”需求量很大,我是否需要考虑某种bean池?任何其他反馈将是最受欢迎的。如果你愿意,请把我撕成碎片 - 我可以接受它!
非常感谢
答案 0 :(得分:0)
显然,在这类事情上有两个重要的工作领域。
第一个是识别要触发的规则,第二个是实际执行它们。
根据您的过滤和动态,规则查询可能很容易被记忆,因此查找的成本可能接近零。当你想到它时,500条规则并不是很多。
接下来,是实际执行。如果你所有的东西都是单身,那么你需要关注单身人士的启动,线程安全等等。
基本上,只需确保每个规则都有生命周期。 “开始”“跑”“停止”。如果它是一个真正的单例,从运行到运行需要一些状态,那么start和stop方法可能会有逻辑。如果在输入上运行只是一些逻辑,那么可能没有必要启动和停止(它们可以是空方法),或者它根本就是单例,所以只需创建一个新实例,启动它把它扔掉。
你没有提到逻辑方面的“规则”是什么。它们很容易就是遵循此生命周期的简单Java类。添加@SingeletonRule注释,或实现isSingleton,无论如何。
真的,在这个级别上,这种系统几乎没有火箭科学。神奇主要在于元数据和实际创建执行规则列表。
简单的规则系统很简单。