2011-04-05 29 views
0

我的企业应用程序当前运行在Weblogic 10.3.4,Java 1.6和Spring 2.0.8上。这是一个最近的升级,因此Spring尚未更新,并且一些Java代码库仍旧处于旧版1.4风格。Java数据库驱动业务规则 - 设计思想?

目前我们使用propriatory规则引擎来运行我们的业务规则。然而,由于我们不使用任何推理引擎功能,所以这是过分的,我们不能再证明许可成本。该计划是编写一个数据库驱动的规则引擎。

每个表单请求都会有任何数量的关联规则,这些规则将使用几个基本的数据库表进行配置。

到目前为止,我的设计是数据库中定义的每个规则都将通过Spring映射到Singleton无状态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池?任何其他反馈将是最受欢迎的。如果你愿意,可以撕碎我的碎片 - 我可以接受它!

很多谢谢

+1

为什么重新发明轮子而不是使用开源规则引擎? – CoolBeans 2011-04-05 22:23:34

+0

正如你所知,“专有”通常意味着“我们拥有并自己定制的系统” – 2011-04-05 22:31:50

+1

也许他们不想将几个未知的,可能的(可能)未被记录的黑盒逻辑引入到他们的基础设施中,他们需要的是一个类名称列表,其中包含一些元数据过滤功能,可以迭代。 – 2011-04-05 22:35:30

回答

0

很明显,在这种事情上有两个总的工作要做。

第一个是确定要触发的规则,第二个是实际执行它们。

根据您的过滤和动态,规则查询可能很容易被记忆,所以查找的成本可能接近于零。 500条规则并不是真的很多,当你想到它。

接下来是实际执行。如果你的所有东西都是单身人士,那么你需要关心单身人士启动,线程安全等。

基本上,只要确保你的每个规则都有一个生命周期。 “开始”“运行”“停止”。如果它是一个真正的单例,需要运行一些状态来运行,那么启动和停止方法可能会有逻辑。如果在输入上运行只是一点逻辑,那么可能不需要启动和停止(它们可以是空方法),或者它可以是单例,所以只需创建一个新实例,然后启动它,并把它扔掉。

你没有提到逻辑上的“规则”是什么。它们可以很容易地成为遵循此生命周期的简单Java类。添加@SingeletonRule注解,或实现isSingleton,无论如何。

真的,在这个水平上,这种系统还是很少有火箭科学。魔术主要在元数据和实际创建的执行规则列表中。

简单的规则系统很简单。

+0

谢谢你。真正有用的,这个想法是保持尽可能简单。真的喜欢注解的想法来解决生命周期问题。再次感谢 – Elwood 2011-04-06 15:13:13