1.規(guī)則
??規(guī)則是運作規(guī)律所遵循的法則。比如 1+1=2,紅燈停,綠燈行。他們都是當滿足某一些條件時,接下來要做某些事情。所以規(guī)則可以簡化成 當 。。。的時候,做。。。。事。
2.規(guī)則引擎drools
??是什么:drools是業(yè)務規(guī)則管理系統,具有基于前向鏈接和后向鏈接推理的規(guī)則引擎。
??做什么:drools可以快速可靠地評估業(yè)務規(guī)則和復雜的事件處理。規(guī)則引擎也是創(chuàng)建專家系統的基本構建塊。
??怎么做:將業(yè)務策略從程序中抽離出來,用一套定義好的語言來編寫業(yè)務規(guī)則,通過數據的輸入,來決定不同的業(yè)務決策。這是drools做的內容。
3.業(yè)務場景
??3.1.存在一個非常復雜的場景,即使對于商業(yè)專家也難以完全定義
??3.2.沒有已知或定義明確的算法解決方案
??3.3.有不穩(wěn)定需求,需要經常更新
??3.4.需要快速做出決策,通常是基于部分數據量
4.規(guī)則結構
??一條規(guī)則由包名,規(guī)則名,規(guī)則的條件(left hand side),規(guī)則的結果(right hand side)構成。
5.規(guī)則例子
以下是一個簡單的例子:基本drl文件:
package sample
import sample.DroolTest.Message;
rule "helloWorld"
when
m : Message( status == Message.HELLO, myMessage : message )
then
System.out.println( myMessage );
m.setMessage( "Goodbye world" );
m.setStatus( Message.GOODBYE );
update( m );
end
rule "GoodBye"
when
Message( status == Message.GOODBYE, myMessage : message)
then
System.out.println(myMessage);
end
基本規(guī)則就是以上drl中的內容。上文包含了兩條規(guī)則。
6.Java中如何運用一條規(guī)則
以下是規(guī)則構建器的創(chuàng)造,及規(guī)則的加載方式,規(guī)則構建庫,以及規(guī)則的執(zhí)行運用
public class DroolTest {
public static final void main(String[] args) {
try {
// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();//創(chuàng)建會話
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
// go !
Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
ksession.insert(message);//插入
ksession.fireAllRules();//執(zhí)行規(guī)則
logger.close();//關閉
} catch (Throwable t) {
t.printStackTrace();
}
}
private static KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();//創(chuàng)建規(guī)則構建器
kbuilder.add(ResourceFactory.newClassPathResource("sample/helloWorld.drl"), ResourceType.DRL);//加載規(guī)則文件,并增加到構建器
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {//編譯規(guī)則過程中發(fā)現規(guī)則是否有錯誤
for (KnowledgeBuilderError error: errors) {System.out.println("規(guī)則中存在錯誤,錯誤消息如下:");
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();//創(chuàng)建規(guī)則構建庫
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());//構建器加載的資源文件包放入構建庫
return kbase;
}
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;
}
}
}
輸出的內容
Hello World
Goodbye world