dools程序开发,环境:java1.8,ecipse 版本Version: Neon.1a Release (4.6.1)Build id: 20161007-1200
pom.xml内容:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>DroolTest</groupId>
<artifactId>DroolTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<drools-version>7.0.0.Final</drools-version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools-version}</version>
</dependency>
</dependencies>
<packaging>war</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
</project>
===============================================
规则文件com/rules/Rules.drl内容:
package com.rules
import com.secbro.drools.model.Product
//这里可以写注释
rule Offer4Diamond
when
productObject : Product(type == Product.DIAMOND)
then
productObject.setDiscount(15);
end
//这里可以写注释
rule Offer4Gold
when
productObject: Product(type == Product.GOLD)
then
productObject.setDiscount(25);
end
==============================================
运行程序,虽然很老,但是在7.0版本中仍然可以正常运行。
package com.secbro.drools;
import com.secbro.drools.model.Product;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.definition.KnowledgePackage;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.runtime.StatefulKnowledgeSession;
import java.util.Collection;
public class Drools5xTest {
public static void main(String[] args) {
Drools5xTest test = new Drools5xTest();
test.oldExecuteDrools();
}
private void oldExecuteDrools() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("com/rules/Rules.drl",
this.getClass()), ResourceType.DRL);
if (kbuilder.hasErrors()) {
System.out.println(kbuilder.getErrors().toString());
}
Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
// add the package to a rulebase
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
// 将KnowledgePackage集合添加到KnowledgeBase当中
kbase.addKnowledgePackages(pkgs);
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Product product = new Product();
// product.setType(Product.GOLD);
product.setType(Product.DIAMOND);
ksession.insert(product);
ksession.fireAllRules();
ksession.dispose();
System.out.println("商品类型和折扣为: " + product.getType()
+ " is " + product.getDiscount()+"%");
}
@Test
public void testRules() {
// 构建KieServices
KieServices ks = KieServices.Factory.get();
KieContainer kieContainer = ks.getKieClasspathContainer();
// 获取kmodule.xml中配置中名称为ksession-rule的session,默认为有状态的。
KieSession kSession = kieContainer.newKieSession("ksession-rule");
Product product = new Product();
product.setType(Product.GOLD);
kSession.insert(product);
int count = kSession.fireAllRules();
System.out.println("命中了" + count + "条规则!");
System.out.println("商品" +product.getType() + "的商品折扣为" + product.getDiscount() + "%。");
}
}
=====================================================
Product.java内容:
package com.secbro.drools.model;
public class Product {
/**
* 钻石
*/
public static final String DIAMOND = "0";
/**
* 黄金
*/
public static final String GOLD = "1";
private String type;
private int discount;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getDiscount() {
return discount;
}
public void setDiscount(int discount) {
this.discount = discount;
}
}
=======================================================
运行结果会输出:
商品类型和折扣为: 0 is 15%
=======================================================
修改规则文件Rules.drl,就可以看到不同的规则能产生不同的输出结果了。
=============================================================
drools新版本写法:7.17.0.Final版
package com.sample;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
/**
* This is a sample class to launch a rule.
*/
public class DroolsTest {
public static final void main(String[] args) {
try {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
// go !
Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
kSession.insert(message);
kSession.fireAllRules();
} catch (Throwable t) {
t.printStackTrace();
}
}
public static class Message {
public static final int HELLO = 0;
public static final int GOODBYE = 1;
private String message;
private int status;
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
public int getStatus() {
return this.status;
}
public void setStatus(int status) {
this.status = status;
}
}
}
=================================================
Sample.drl文件内容:
package com.sample
import com.sample.DroolsTest.Message;
rule "Hello World"
when
m : Message( status == Message.HELLO, myMessage : message )
then
System.out.println( myMessage );
m.setMessage( "Goodbye cruel world" );
m.setStatus( Message.GOODBYE );
update( m );
end
rule "GoodBye"
when
Message( status == Message.GOODBYE, myMessage : message )
then
System.out.println( myMessage );
end
=================================================
kmodule.xml配置内容:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="ksession-rules"/>
</kbase>
<kbase name="dtables" packages="dtables">
<ksession name="ksession-dtables"/>
</kbase>
<kbase name="process" packages="process">
<ksession name="ksession-process"/>
</kbase>
</kmodule>
=================================================
7.17.0.Final版支持多种资源,rule规则,决策表DecisionTable(源文件居然是个xls???),流程定义文件bpmn
=================================================
sample.bpmn内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<definitions id="Definition"
targetNamespace="http://www.jboss.org/drools"
typeLanguage="http://www.java.com/javaTypes"
expressionLanguage="http://www.mvel.org/2.0"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
xmlns:tns="http://www.jboss.org/drools">
<process id="com.sample.bpmn.hello" tns:packageName="defaultPackage" name="Hello World" isExecutable="true" processType="Private">
<!-- nodes -->
<scriptTask id="_2" name="Hello" >
<script>System.out.println("Hello World");</script>
</scriptTask>
<startEvent id="_1" />
<endEvent id="_3" >
<terminateEventDefinition/>
</endEvent>
<!-- connections -->
<sequenceFlow id="_1-_2" sourceRef="_1" targetRef="_2" />
<sequenceFlow id="_2-_3" sourceRef="_2" targetRef="_3" />
</process>
<bpmndi:BPMNDiagram>
<bpmndi:BPMNPlane bpmnElement="com.sample.bpmn.hello" >
<bpmndi:BPMNShape bpmnElement="_2" >
<dc:Bounds x="96" y="16" width="80" height="48" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_1" >
<dc:Bounds x="30" y="22" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_3" >
<dc:Bounds x="210" y="22" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="_1-_2" >
<di:waypoint x="66" y="40" />
<di:waypoint x="96" y="40" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_2-_3" >
<di:waypoint x="176" y="40" />
<di:waypoint x="210" y="40" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
==============================================================
基本的套路是先定义规则或者决策表,然后定义流程引用规则或决策表。然后,输出流程结果。