Drools入门-----------环境搭建,分析Helloworld Drools5.0的xls文件转drl文件提升解析效率 使用BRMS的Tomcat6.0配置

本文主要是介绍Drools入门-----------环境搭建,分析Helloworld Drools5.0的xls文件转drl文件提升解析效率 使用BRMS的Tomcat6.0配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://justsee.iteye.com/blog/1198259

Drools官网:http://www.jboss.org/drools

Drools and jBPM consist out of several projects:(Drools软件包提供的几个部分的功能)

Drools Guvnor (Business Rules Manager) (规则集管理器

Drools Expert (rule engine) (规则引擎

jBPM 5 (process/workflow) (工作流
Drools Fusion (event processing/temporal reasoning) (规则集引擎搜索与规划

Drools Planner (automated planning) 决策表

-----------------------------------------------------------------------------------------------------------------------

Eclipse3.5安装Drools5.2.0.Final插件

到Drools下载页面(现在是http://www.jboss.org/drools/downloads.html)

-下载并解压Drools:drools-distribution-5.2.0.Final.zip(解压目录随意)

-下载并解压插件:droolsjbpm-tools-distribution-5.2.0.Final.zip(解压目录随意)

- 打开 Eclipse.

- 点 "Help"—"Install new software..."

- 点击 "Add..."

- 在name中输入"DroolsLocaluUpdateSite"(名字随意起)

- 点击 "Local..." 并且选择"......./binaries/org.drools.updatesite" (此目录在刚刚解压的插件中)

- 点击OK

- 选择所以插件。

-下面就是点击next,finish

插件安装完后还需在Eclipse中添加Drools的运行环境:

- 点击"Windows"—"Preferencess"

- 在窗口的树形菜单中选择"Drools"—"Installed Drools Runtimes"

- 在右边的空的Drools运行库列表中,点击"Add"

- 在弹出窗口中name输入DroolsRuntime(随意起个名字),在Path选择"......./drools-distribution-5.2.0.Final\drools-distribution-5.2.0.Final\binaries"(此目录在刚刚解压的Drools中),

- 点击"OK"

- 点击"OK"

-----------------------------------------------------------------------------------------------------------------------

HelloWorld例子

- "New"—"Project"—"Drools Project"—输入项目名—"Next"

- 这里显示可以选择要生成的样例文件的类型(3种类型的6种样例文件:规则引擎样例的规则文件和Java测试类;决策表开发的决策表文件和java测试类;工作流的流程文件和java测试类)。勾选规则引擎样例的规则文件和java测试类,点击"Next"

- 进入到Drools运行时库的选择界面。环境搭建中已经设置了默认的运行时库,这里加载。然后选择编译代码所使用的规则引擎版本,这里选择"Drools 5.1 or above",点击"Finish"

Sample.drl :规则引擎的样例文件,该文件根据Drools规则语言语法编写 收藏代码

  1. package com.sample
  2. import com.sample.DroolsTest.Message;
  3. rule "Hello World"
  4. when
  5. //LHS块
  6. //在working Memory中,如果存在一个Message对象满足他的status属性等于Message.HELLO条件,
  7. //就把满足条件的Message实例用变量m表示,他的message属性用myMessage表示,以便在RHS中使用。
  8. m : Message( status == Message.HELLO, myMessage : message )
  9. then
  10. //RHS块
  11. //在LHS中满足条件就运行RHS块。用到了LHS中的变量m,myMessage
  12. System.out.println( myMessage );
  13. m.setMessage( "Goodbye cruel world" );
  14. m.setStatus( Message.GOODBYE );
  15. update( m );//表示把此Message实例在 working memory中更新.这便会触发名称为"GoodBye"的rule,
  16. end
  17. rule "GoodBye"
  18. when
  19. Message( status == Message.GOODBYE, myMessage : message )
  20. then
  21. System.out.println( myMessage );
  22. end

  1. package com.sample  
  2.    
  3. import com.sample.DroolsTest.Message;  
  4.    
  5. rule "Hello World"  
  6.     when  
  7.        //LHS块  
  8.        //在working Memory中,如果存在一个Message对象满足他的status属性等于Message.HELLO条件,  
  9.        //就把满足条件的Message实例用变量m表示,他的message属性用myMessage表示,以便在RHS中使用。  
  10.         m : Message( status == Message.HELLO, myMessage : message )  
  11.     then  
  12.        //RHS块  
  13.        //在LHS中满足条件就运行RHS块。用到了LHS中的变量m,myMessage  
  14.         System.out.println( myMessage );  
  15.         m.setMessage( "Goodbye cruel world" );  
  16.         m.setStatus( Message.GOODBYE );  
  17.         update( m );//表示把此Message实例在 working memory中更新.这便会触发名称为"GoodBye"的rule,   
  18. end  
  19.   
  20. rule "GoodBye"  
  21.     when  
  22.         Message( status == Message.GOODBYE, myMessage : message )  
  23.     then  
  24.         System.out.println( myMessage );  
  25. end  

DroolsTest.java:java测试类,用来读取Sample.drl 并运行,该文件使用Drools规则引擎的API进行编写 收藏代码

  1. package com.sample;
  2. import org.drools.KnowledgeBase;
  3. import org.drools.KnowledgeBaseFactory;
  4. import org.drools.builder.KnowledgeBuilder;
  5. import org.drools.builder.KnowledgeBuilderError;
  6. import org.drools.builder.KnowledgeBuilderErrors;
  7. import org.drools.builder.KnowledgeBuilderFactory;
  8. import org.drools.builder.ResourceType;
  9. import org.drools.io.ResourceFactory;
  10. import org.drools.logger.KnowledgeRuntimeLogger;
  11. import org.drools.logger.KnowledgeRuntimeLoggerFactory;
  12. import org.drools.runtime.StatefulKnowledgeSession;
  13. /**
  14. * This is a sample class to launch a rule.
  15. */
  16. public class DroolsTest {
  17. public staticfinal void main(String[] args) {
  18. try {
  19. // load up the knowledge base
  20. KnowledgeBase kbase = readKnowledgeBase();
  21. StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();//创建会话
  22. KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession,"test");
  23. // go !
  24. Message message = new Message();
  25. message.setMessage("Hello World");
  26. message.setStatus(Message.HELLO);
  27. ksession.insert(message);//插入
  28. ksession.fireAllRules();//执行规则
  29. logger.close();//关闭
  30. catch (Throwable t) {
  31. t.printStackTrace();
  32. }
  33. }
  34. private static KnowledgeBase readKnowledgeBase()throws Exception {
  35. KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();//创建规则构建器
  36. kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL);//加载规则文件,并增加到构建器
  37. KnowledgeBuilderErrors errors = kbuilder.getErrors();
  38. if (errors.size() > 0) {//编译规则过程中发现规则是否有错误
  39. for (KnowledgeBuilderError error: errors) {System.out.println("规则中存在错误,错误消息如下:");
  40. System.err.println(error);
  41. }
  42. throw new IllegalArgumentException("Could not parse knowledge.");
  43. }
  44. KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();//创建规则构建库
  45. kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());//构建器加载的资源文件包放入构建库
  46. return kbase;
  47. }
  48. public staticclass Message {
  49. public staticfinal int HELLO =0;
  50. public staticfinal int GOODBYE =1;
  51. private String message;
  52. private int status;
  53. public String getMessage() {
  54. return this.message;
  55. }
  56. public void setMessage(String message) {
  57. this.message = message;
  58. }
  59. public int getStatus() {
  60. return this.status;
  61. }
  62. public void setStatus(int status) {
  63. this.status = status;
  64. }
  65. }
  66. }opy
  1. package com.sample;  
  2.   
  3. import org.drools.KnowledgeBase;  
  4. import org.drools.KnowledgeBaseFactory;  
  5. import org.drools.builder.KnowledgeBuilder;  
  6. import org.drools.builder.KnowledgeBuilderError;  
  7. import org.drools.builder.KnowledgeBuilderErrors;  
  8. import org.drools.builder.KnowledgeBuilderFactory;  
  9. import org.drools.builder.ResourceType;  
  10. import org.drools.io.ResourceFactory;  
  11. import org.drools.logger.KnowledgeRuntimeLogger;  
  12. import org.drools.logger.KnowledgeRuntimeLoggerFactory;  
  13. import org.drools.runtime.StatefulKnowledgeSession;  
  14.   
  15. /** 
  16.  * This is a sample class to launch a rule. 
  17.  */  
  18. public class DroolsTest {  
  19.   
  20.     public static final void main(String[] args) {  
  21.         try {  
  22.             // load up the knowledge base  
  23.             KnowledgeBase kbase = readKnowledgeBase();  
  24.             StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();//创建会话  
  25.             KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");  
  26.             // go !  
  27.             Message message = new Message();  
  28.             message.setMessage("Hello World");  
  29.             message.setStatus(Message.HELLO);  
  30.             ksession.insert(message);//插入  
  31.             ksession.fireAllRules();//执行规则  
  32.             logger.close();//关闭  
  33.         } catch (Throwable t) {  
  34.             t.printStackTrace();  
  35.         }  
  36.     }  
  37.   
  38.     private static KnowledgeBase readKnowledgeBase() throws Exception {  
  39.         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();//创建规则构建器  
  40.         kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL);//加载规则文件,并增加到构建器  
  41.         KnowledgeBuilderErrors errors = kbuilder.getErrors();  
  42.         if (errors.size() > 0) {//编译规则过程中发现规则是否有错误  
  43.             for (KnowledgeBuilderError error: errors) {System.out.println("规则中存在错误,错误消息如下:");  
  44.                 System.err.println(error);  
  45.             }  
  46.             throw new IllegalArgumentException("Could not parse knowledge.");  
  47.         }  
  48.         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();//创建规则构建库  
  49.         kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());//构建器加载的资源文件包放入构建库  
  50.         return kbase;  
  51.     }  
  52.   
  53.     public static class Message {  
  54.   
  55.         public static final int HELLO = 0;  
  56.         public static final int GOODBYE = 1;  
  57.   
  58.         private String message;  
  59.   
  60.         private int status;  
  61.   
  62.         public String getMessage() {  
  63.             return this.message;  
  64.         }  
  65.   
  66.         public void setMessage(String message) {  
  67.             this.message = message;  
  68.         }  
  69.   
  70.         public int getStatus() {  
  71.             return this.status;  
  72.         }  
  73.   
  74.         public void setStatus(int status) {  
  75.             this.status = status;  
  76.         }  
  77.   
  78.     }  
  79.   
  80. }  

DroolsTest.rar (5.8 KB)

http://sunxboy.iteye.com/blog/1464919

drools中,支持的常见文件类型有drl(drools的规则语言),xls,cvs,rf(规则流文件),drt(drools rule template),在简单的应用中,一般只会使用drl和xls的文件,为了方便业务人员和维护人员能够配置规则文件,一般的规则文件都是由程序员做成execl文件,这样一来,添加相关的配置就很傻瓜了。但是这样做会影响到程序运行的效率,我们做一个测试。

规则文件:base.xls 包含了 rule.xls和simple.xls;在rule.xls中包括了credit.xls,为了读取credit.xls中的规则对象,则需要对base.xls ,rule.xls,credit.xls三个execl文件解析,读取规则对象结果合计耗时:

读取规则文件耗时——————–13484毫秒

在drools5.0中,org.drools.decisiontable.SpreadsheetCompiler这个类可以把xls文件流转化为drl的String对象,通过FileWriter来写成drl文件,相关的转换代码是:
public String drlString(String file,String toDir) throws Exception{
SpreadsheetCompiler sc = new SpreadsheetCompiler();
File f = new File(file);
String fileName = f.getName();
String name = fileName.substring(0,fileName.lastIndexOf("."));
FileInputStream xlsStream = new FileInputStream(f);
String drlFileTmp = sc.compile(xlsStream, InputType.XLS);
drlFileTmp.replaceAll(".xls", ".drl");
File drlFile = new File(toDir + "/" + name + ".drl");
FileWriter writer = new FileWriter(drlFile);
writer.write(drlFileTmp);
writer.close();
return drlFileTmp;
}
把execl解析成为drl文件后,读取规则对象结果合计耗时:

读取规则文件耗时——————--7579毫秒

从数据上看,几乎节省了一半的时间开销。当然,7.6秒仍然不是一个可以接受的数字,需要继续优化。我们需要在系统打版本的时候,就把xls规则文件转换为drl规则文件,然后我们在系统启动的时候,把规则对象通过oscache缓存在内存中。如果没有该对象则重新从规则文件中读取,有的话直接从内存读取,这样一来,读取规则对象消耗的时间几乎为0。这里把xls转化为drl文件只是为了加速系统的启动。

http://xiaoyanzi1205.iteye.com/blog/611936

我们公司服务器是websphere,所以我测试的时候决定用Tomcat6.0测试,以便以后部署到服务器上。 
Tomcat6.0要求: 
1.jdk5.0以上,而且必须是sun公司的(IBM的jdk发布时会报错); 
2.下载所需的jar包,网址:http://download.jboss.org/drools/dependencies/jboss_jsf_libs.zip,解压后放到TOMCAT_HOME/lib下。
3.删除掉drools-guvnor.war里lib下面自带的el-api.jar(因为Tomcat6.0已经自带了,其他Tomcat版本不清楚)。 

然后把drools-guvnor.war直接扔到Tomcat的webapps下,启动Tomcat即可。 
访问BRMS:http://localhost:8080/drools-guvnor/org.drools.guvnor.Guvnor/Guvnor.html 

username:admin 
password:null 
结束。

这篇关于Drools入门-----------环境搭建,分析Helloworld Drools5.0的xls文件转drl文件提升解析效率 使用BRMS的Tomcat6.0配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/653383

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx