java規則引擎
1. java實際開發中常用的技術有哪些
RMI: java自身提供的用在分布時對象之間的通信機制。(類似於RPC)
RMI-IIOP: RMI的可移植擴展,可以實現JAVA與CORBA的集成。
JDBC: 用於資料庫訪問的通用介面。
JTA,JTS: 用於提供事務處理的支持。
JMS: java消息服務。可以連接已有的面向消息的中間件,例如:MQSeries,MSMQ。
Java Servlet: 用來擴展Web伺服器功能的網路組件。基於請求/響應機制。
JSP: Java與HTML混合編程,類似於ASP。
JavaIDL: Java對COBRA的實現,允許與其他預言集成。且能讓分布式對象利用CORBA提供的全面服務。所以J2EE與CORBA完全兼容。
Java Mail: 平台無關,協議無關地發送郵件。
J2EE連接器架構: 自動管理現有系統和中間件之間的諸多細節。
JAXP: Java操作XML。
JAAS: Java的用戶認證支持。
EJB: J2EE中最重要的部分,實現組件式開發的基礎。可以在多層的分布式環境中部署的伺服器端軟體組件。
JNI: (Java Native Interface)
聲明Native代碼,用C/C++實現它。可以實現:
1、 使用標准JAVA不支持的功能,例如訪問Win32API。
2、 重用其他語言編寫的庫或應用程序。例如大量的C庫。
3、 需要用低級語言編程時,例如匯編。
Oracle所實現的C底層代碼與Java的無縫集成,就是JNI技術的很好例證。Oracle不單使用Java界面,還支持Java編寫的存儲過程。
JNDI: 用於訪問命令和目錄系統。
JNDI為底層命名或目錄服務提供統一的API。可支持任何伺服器名稱,標准服務有:LDAP,NDS,CORBA,LDAP活動目錄等。
J2EE終,可用JNDI發布下列組件:EJB,數據源(資料庫),JMS消息隊列。
2. java 規則引擎哪個好
Java規則引擎API(JSR-94)允許客戶程序使用統一的方式和不同廠商的規則引擎產品交互,一定程度上給規則引擎廠商提供了標准化規范。但其幾乎沒有定義什麼是規則引擎,當然也沒有深入到規則是如何構建和操縱的,規則調用的效用,規則與Java語言的綁.
3. Java規則引擎如何集成
Java 規則引擎是一種嵌入在 Java 程序中的組件,它的任務是把當前提交給引擎的 Java 數據對象 ( 原料 ) 與載入在引擎中的業務規則( app )進行測試和比對,激活那些符合當前數據狀態下的業務規則,根據業務規則中聲明的執行邏輯,觸發應用程序中對應的操作。
引言:
目前, Java 社區推動並發展了一種引人注目的新技術 ——Java 規則引擎( Rule Engine )。利用它就可以在應用系統中分離商業決策者的商業決策邏輯和應用開發者的技術決策,並把這些商業決策放在中心資料庫或其他統一的地方,讓它們能在運行時可以動態地管理和修改,從而為企業保持靈活性和競爭力提供有效的技術支持。
規則引擎的原理
1 、基於規則的專家系統( RBES )簡介
Java 規則引擎起源於基於規則的專家系統,而基於規則的專家系統又是專家系統的其中一個分支。專家系統屬於人工智慧的范疇,它模仿人類的推理方式,使用試探性的方法進行推理,並使用人類能理解的術語解釋和證明它的推理結論。為了更深入地了解 Java 規則引擎,下面簡要地介紹基於規則的專家系統。 RBES 包括三部分:Rule Base ( knowledge base )、 Working Memory ( fact base )和 Inference Engine 。它們的結構如下系統所示:
圖 1 基於規則的專家系統構成
如圖 1 所示,推理引擎包括三部分:模式匹配器( Pattern Matcher )、議程( Agenda )和執行引擎(Execution Engine )。推理引擎通過決定哪些規則滿足事實或目標,並授予規則優先順序,滿足事實或目標的規則被加入議程。模式匹配器決定選擇執行哪個規則,何時執行規則;議程管理模式匹配器挑選出來的規則的執行次序;執行引擎負責執行規則和其他動作。
和人類的思維相對應,推理引擎存在兩者推理方式:演繹法( Forward-Chaining )和歸納法( Backward-Chaining )。演繹法從一個初始的事實出發,不斷地應用規則得出結論(或執行指定的動作)。而歸納法則是根據假設,不斷地尋找符合假設的事實。 Rete 演算法是目前效率最高的一個 Forward-Chaining 推理演算法,許多 Java 規則引擎都是基於 Rete 演算法來進行推理計算的。
推理引擎的推理步驟如下:
(1) 將初始數據( fact )輸入 Working Memory 。
(2) 使用 PatternMatcher 比較規則庫( rule base )中的規則( rule )和數據( fact )。
(3) 如果執行規則存在沖突( conflict ),即同時激活了多個規則,將沖突的規則放入沖突集合。
(4) 解決沖突,將激活的規則按順序放入 Agenda 。
(5) 使用執行引擎執行 Agenda 中的規則。重復步驟 2 至 5 ,直到執行完畢所有 Agenda 中的規則。
上述即是規則引擎的原始架構, Java 規則引擎就是從這一原始架構演變而來的。
2 、規則引擎相關構件
規則引擎是一種根據規則中包含的指定過濾條件,判斷其能否匹配運行時刻的實時條件來執行規則中所規定的動作的引擎。與規則引擎相關的有四個基本概念,為更好地理解規則引擎的工作原理,下面將對這些概念進行逐一介紹。
1) 信息元( InformationUnit )
信息元是規則引擎的基本建築塊,它是一個包含了特定事件的所有信息的對象。這些信息包括:消息、產生事件的應用程序標識、事件產生事件、信息元類型、相關規則集、通用方法、通用屬性以及一些系統相關信息等等。
2) 信息服務( InformationServices )
信息服務產生信息元對象。每個信息服務產生它自己類型相對應的信息元對象。即特定信息服務根據信息元所產生每個信息元對象有相同的格式,但可以有不同的屬性和規則集。需要注意的是,在一台機器上可以運行許多不同的信息服務,還可以運行同一信息服務的不同實例。但無論如何,每個信息服務只產生它自己類型相對應的信息元。
3) 規則集( Rule Set )
顧名思義,規則集就是許多規則的集合。每條規則包 含一個條件過濾器 和多個動作 。一個條件過濾器可以包含多個過濾條件。條件過濾器是多個布爾表達式的組合,其組合結果仍然是一個布爾類型的。在程序運行時, 動作將會在條件過濾器值為 true 的情況下執行。除了一般的執行動作,還有三類比較特別的動作,它們分別是:放棄動作( Discard Action )、包含動作( Include Action )和使信息元對象內容持久化的動作。前兩種動作類型的區別將在 2.3 規則引擎工作機制小節介紹。
4) 隊列管理器( QueueManager )
隊列管理器用來管理來自不同信息服務的信息元對象的隊列。
下面將研究規則引擎的這些相關構件是如何協同工作的。
如圖 2 所示,處理過程分為四個階段進行:信息服務接受事件並將其轉化為信息元,然後這些信息元被傳給隊列管理器,最後規則引擎接收這些信息元並應用它們自身攜帶的規則加以執行,直到隊列管理器中不再有信息元。
圖 2 處理過程協作圖
3 、規則引擎的工作機制
下面專門研究規則引擎的內部處理過程。如圖 3 所示,規則引擎從隊列管理器中依次接收信息元,然後依規則的定義順序檢查信息元所帶規則集中的規則(規則已經排隊就緒等待信息元的到來)。如圖所示,規則引擎檢查第一個規則並對其條件過濾器求值,如果值為假,所有與此規則相關的動作皆被忽略並繼續執行下一條規則。如果第二條規則的過濾器值為真,所有與此規則相關的動作皆依定義順序執行,執行完畢繼續下一條規則。該信息元中的所有規則執行完畢後,信息元將被銷毀 ,然後從隊列管理器接收下一個信息元。在這個過程中並未考慮兩個特殊動作:放棄動作( Discard Action )和包含動作( Include Action )。放棄動作如果被執行,將會跳過其所在信息元中接下來的所有規則,並銷毀所在信息元,規則引擎繼續接收隊列管理器中的下一個信息元 ( 就是短路了 ) 。包含動作其實就是動作中包含其它現存規則集的動作。包含動作如果被執行,規則引擎將暫停並進入被包含的規則集,執行完畢後,規則引擎還會返回原來暫停的地方繼續執行。這一過程將遞歸進行。
圖 3 規則引擎工作機制
Java 規則引擎的工作機制與上述規則引擎機制十分類似,只不過對上述概念進行了重新包裝組合。 Java 規則引擎對提交給引擎的 Java 數據對象進行檢索,根據這些對象的當前屬性值和它們之間的關系,從載入到引擎的規則集中發現符合條件的規則,創建這些規則的執行實例。這些實例將在引擎接到執行指令時、依照某種優先序依次執行。一般來講, Java 規則引擎內部由下面幾個部分構成:
工作內存( Working Memory )即工作區,用於存放被引擎引用的數據對象集合;
規則執行隊列,用於存放被激活的規則執行實例 ;
靜態規則區,用於存放所有被載入的業務規則,這些規則將按照某種數據結構組織,
當工作區中的數據發生改變後,引擎需要迅速根據工作區中的對象現狀,調整規則執行隊列中的規則執行實例。Java 規則引擎的結構示意圖如圖 4 所示。
圖 4 Java 規則引擎工作機制
當引擎執行時,會根據規則執行隊列中的優先順序逐條執行規則執行實例,由於規則的執行部分可能會改變工作區的數據對象,從而會使隊列中的某些規則執行實例因為條件改變而失效,必須從隊列中撤銷,也可能會激活原來不滿足條件的規則,生成新的規則執行實例進入隊列。於是就產生了一種 「 動態 」 的規則執行鏈,形成規則的推理機制。這種規則的 「 鏈式 」 反應完全是由工作區中的數據驅動的。
任何一個規則引擎都需要很好地解決規則的推理機制 和規則條件匹配的效率問題 。規則條件匹配的效率決定了引擎的性能,引擎需要迅速測試工作區中的數據對象,從載入的規則集中發現符合條件的規則,生成規則執行實例。1982 年美國卡耐基 • 梅隆大學的 Charles L. Forgy 發明了一種叫 Rete 演算法,很好地解決了這方面的問題。目前世界頂尖的商用業務規則引擎產品基本上都使用 Rete 演算法。
4. 規則引擎中怎麼引入java文件作為決策表的入參和出參
this代表當前對象,只能在本類中使用
例如本類定義為A,引用類B,類B中有方法參數值為類A,那麼A中調用類B的那個方法,就可以使用this傳遞</ol>
5. JAVA開發工程師的職業發展是
1.Java程序員
這是Java開發工程師的第一階段了,一般是剛入門Java行業者。這一階段主要是掌握了一定的Java編程技術,有一定的Java語言基礎,能夠了解、掌握和編寫一定的代碼。處在這一階段的人員,其掌握的技能還是比較基礎的。
2.Java初級軟體工程師
這一階段,就要掌握一些Java核心技術了。比如HTML/CSS/JS/XML/AJAX、SQL/MySQL/Oracle/SQLServer/JDBC等。
3.Java中級工程師
這一階段需要掌握Java核心框架,SSM、SSH、Web伺服器等等。
4.Java高級工程師
這一階段主要是Java高級開發技術,工作流、規則引擎、緩存、集成JCA、EJB、通信/JNDI/JMS/JAF、應用伺服器(JBossAS/WebLogic/WebSphere)等。
5.Java系統架構師
Java系統架構師這一職位主要涉及到Java系統的設計與架構,如面向服務架構、面向資源架構、面向雲架構、Java與UML建模、Java設計模式等。
6.技術總監
到了技術總監的崗位,就不僅僅只是技術,更多的可能是技術管理職能。如產品管理、項目管理、團隊建設、團隊提升等,這都是一個技術總監的職責所在。
6. 詳解什麼是Java規則引擎
Java規則引擎API(JSR-94)允許客戶程序使用統一的方式和不同廠商的規則引擎產品交互,一定程度上給規則引擎廠商提供了標准化規范。但其幾乎沒有定義什麼是規則引擎,當然也沒有深入到規則是如何構建和操縱的,規則調用的效用,規則與Java語言的綁定等方面。並且JSR-94在對J2EE的支持上也不足。規則語言的標准化,JSR-94的進一步的充實深化都有待研究。
7. java 使用規則引擎drools 出現異常
運行時錯誤。報的類的錯誤!和運算沒有關系。ClassUtils.java:378 ConditionAnalyzer.java:723
ConditionAnalyzer.java:690 等等 先檢查你的ClassUtils類 378行 應該是這里 或以下的類搞錯了 導致報許多錯誤。不要怕。報很多錯誤,有時,其實就是一個錯誤引起的。
8. java未來發展趨勢
雖然只有10歲,卻猶如35歲的青壯年一般,Java已經迅速地在眾多領域確立了其地位:對等網路、開放源代碼、無線開發和嵌入式應用程序等等,這還只是其中一些。要准確地把握這門語言的走向是很困難的,因為它正在同時向各個方向齊頭並進。
關於快速開發的一切
毫無疑問:腳本編寫語言,例如Jython、Python、Perl和PHP,正在被越來越多地使用。Jython事實上就是Python編程語言的完整實現。它100%使用純Java編寫而成,並允許對Java庫的輕松訪問。
這種腳本編寫的趨勢在很大程度上是由快速應用程序開發(RAD)推動的,這是一種始終都能夠贏得追隨者的開發風格。由於市場營銷的執行者逼迫IT的生產公司加速產品的開發,因此IT的管理者被迫尋找最有效的方式來滿足最終期限的要求。在這里RAD是主要的源動力。
「你可能很擅長某些腳本語言,並且能夠完成常規Java所不能完成的任務,」Mukund Balasubramanian說。他是位於加利福尼亞州雷德伍德城的Infravio的首席技術官,負責著Java和Web服務的集成。「如果你知道如何使用一門優秀的語言,你就可以在開發中省下很多的時間和金錢。」
腳本語言的優勢
Balasubramanian說,腳本語言具有下列優勢:
快速開發:腳本語言極大地簡化了「開發、部署、測試和調試」的周期過程。
容易部署:大多數腳本語言都能夠隨時部署,而不需要耗時的編譯/打包過程。
同已有技術的集成:腳本語言被Java或者COM這樣的組件技術所包圍,因此能夠有效地利用代碼。
易學易用:很多腳本語言的技術要求通常要低一些,因此能夠更容易地找到大量合適的技術人員。
動態代碼:腳本語言的代碼能夠被實時生成和執行,這是一項高級特性,在某些應用程序里(例如JavaScript里的動態類型)是很有用也是必需的。
腳本語言的劣勢
但是,Java腳本語言有下面這些劣勢:
腳本語言不夠全面。它們會要求一門「真正的」編程語言的存在;例如,你必須找一個資料庫驅動程序將其內置進腳本語言里。
腳本語言並不是軟體工程和構建代碼結構的最佳選擇,例如面向對象和基於組件的開發。
腳本語言通常不是「通用」語言,但是能夠根據專門的應用來調整,例如PHP和萬維網。
「因此,腳本語言能夠在很大程度上加速軟體的開發,但是必須要根據具體的應用來仔細選擇——例如動態Web頁面,或者對『真正的』編程語言進行補充,就像Jython是對Java的補充一樣,」Balasubramanian說。
像IBM的Bean腳本編寫框架(Bean Scripting Framework)這樣的工具使得將Tcl、Python、Perl和其他腳本語言融合進Java應用程序變得相當容易。Sun、Borland、BEA和其他的公司也提供了類似的工具。但是俄勒岡州威爾遜維爾的Mentor Graphics的資深Java開發人員David Kearns指出,支持一門腳本語言就存在耗時和耗錢的風險,不要說支持六門語言了。
在其最近為Java世界所撰寫的一篇文章中,Kearns描述了在你Java應用程序里支持腳本語言所固有的風險。
「在我看來,Jython具有最快的腳本解釋器,並有一些強大的編程特性,」他說。「我唯一真正關心的是Jython的控制流句法(control-flow syntax),這可能對你來說很重要,也可能不重要。對於Jacl而言,編寫用於Jython的腳本的學習曲線可能要比JavaScript或者BeanShell高,(即學習前者要比學習後兩者困難),因為有更多的新東西要學習。如果你想要在Python里編寫不同尋常的腳本,那麼我推薦你去買本書看看。Python是一門很常見的編程語言,所以你在書店裡會有很多的選擇。
其他Java腳本語言
下面列舉出了一些使用最廣泛的面向Java的腳本語言,感謝Java老手——About.com的William Wagers提供這些內容:
Beanshell
BeanShell是一個簡短的、免費的、可下載的、可嵌入的Java源代碼解釋器,它具有使用Java編寫成的對象腳本語言的特性。除了普通的腳本命令和句法之外,BeanShell還能夠執行標準的Java陳述式和表達式。它能夠將腳本對象作為簡單的方法閉塞(method closure)來支持,就像Perl和JavaScript里的一樣。
Jess
Jess是一個完全使用Java語言編寫的規則引擎(rule engine)和腳本環境。Jess最初的靈感來自CLIPS專家系統,但是現在它已經發展成為一個完整的、卓越的動態環境。使用Jess,你能夠創建Java applet以及應用程序,並讓這些程序根據以說明規則(declarative rule)的形式所提供的信息進行「推理」。
JudoScript
JudoScript是一個Java類的腳本,它具有很多特性:HTTP客戶端和伺服器編程、文件系統和歸檔、XML和XSLT腳本編寫、JDBC腳本編寫,以及HTML修飾能力(scraping)。它還有值得炫耀的帶有監控程序的調度程序、sendmail、運行可執行(run executable)、Java GUI的創建、FTP、SSH和SCP,以及Windows注冊表等等。這個軟體可下載,包括源代碼,都是免費的。
Rhino
Rhino使用純Java編寫而成,是一個開放源代碼的JavaScript的實現。它通常被嵌入到Java應用程序里,用來向終端用戶提供腳本編寫的能力。
9. java規則引擎---Jess
該爾傑斯開發環境( JessDE )提供的一套插件為流行的開源的IDE Eclipse的;特別是,這些都是Eclipse的插件版本為3.1或更高版本。請注意,只有JessDE作品的充分「的Eclipse SDK的」 -規模較小的「平台運行二進制」是不夠的。
要安裝JessDE ,只需退出Eclipse的,解壓縮所有文件Jess71p2/eclipse進入最高級別的Eclipse的安裝目錄。確認目錄命名為「 plugins/gov.sandia.jess_7.1.0 」存在,在你的Eclipse的安裝目錄,然後重新啟動Eclipse的。 //////
這段翻譯的結果,不是你的SDK 不是 full "Eclipse SDK"
Jess 7.0p1——Java平台規則引擎(一) 2008-07-12 22:21
分類:JESS 字型大小: 大大 中中 小小 1.入門
1.1.需求
Jess是一個用java語言編寫的程序庫。因此要使用Jess你需要Java虛擬機(JVM)。你可以從 Sun Microsystems上免費得到一個非常適合用於Windows, Linux,Solaris上的JVM。Jess 7是兼容所有版本的Java,從開始的JDK 1.4到現在的最新版本JDK1.5。版本更老的編號為4.x的Jess兼容JDK 1.0, 5.x版本兼容的是JDK1.1,Jess 6工作在JDK1.2及以上版本。
在使用Jess前請先確認JVM是否正確安裝並能正常工作。
使用JessDE集成開發環境,你需要Eclipse SDK的3.1版或更新版本,這個可以從http://www.eclipse.org獲得。安裝JessDE前請確認Eclipse是已經安裝並能正常工作。
Jess類庫為另一種語言擔任譯員,這種語言我在本文檔中稱為Jess語言。Jess語言是一種高度專業化的Lisp形式語言。
我會認為讀者你是將使用這兩種或其中一種語言的一個程序員。並且所有的讀者都至少有起碼Java基礎。另外你必須有一個Java運行系統和知道如何以一個簡單的方法使用這個系統。你應該知道如何用它來:
· 運行一個Java應用程序
· 處理如CLASSPATH變數的配置問題
· 編譯Java源文件集(可選)
如果你沒有對Java的環境有基本的熟悉,那麼我建議你購買了關於java的基礎的書籍。對與各種平台的Java軟體以及豐富的教程和文檔可以免費從http://java.sun.com上獲得。
對於那些將要使用jess語言編寫程序的讀者,我假定你們已經熟悉了一般程序編寫的原理。我會說明整個Jess語言,所以熟悉Lisp是不需要(雖然熟悉是有些用的)。此外,在可能范圍內,我將努力說明基於規則系統的最重要的概念,因為它們適用於Jess。再次,我將假定讀者對這些概念有了一定的熟悉程度和了解更多。如果不熟悉基於規則系統,你也許應當考慮購買一本關於這一主題的書籍。
許多讀者都希望提高Jess的能力,無論是通過向Jess語言加入的命令(用JAVA語言寫)或以Java應用的方式嵌入Jess庫。另外一些人會想用Jess語言的Java集成能力來從Jess語言程序調用Java函數。在本文檔專門針對這類讀者的一些章節中,我將承擔適度Java編程的知識。我不會教Java語言任何方面的知識,有興趣的讀者可到您當地的書店參閱相關書籍。
這個文檔包含了一個目錄,在很多書上這些主題也都被列舉出來。
1.2.准備
1.2.1.安裝包的組成
Jess提供一個可用於所有支持平台的單獨的.zip壓縮包。這個單獨的文件壓縮包包含在Windows,UNIX,或Macintosh系統上使用Jess的所有你需要(除了JVM你必須自己安裝)的資源。當Jess是解壓後,你應該有一個命名為jess71a2 /的目錄。在這個目錄路徑有下列文件和子目錄:
README
快速開始指導.
LICENSE
關於Jess使用的您的權利信息.
bin
一個包含Windows 批處理文件(jess.bat)和一個UNIX腳本(Jess)的目錄,你可以使用它們啟動Jess命令提示符.
lib
該目錄含有作為一個Java檔案文件的Jess本身。注意,這不是一個「點擊」存檔文件,你不可以通過雙擊它運行Jess。這是要注意的。在這個目錄的jsr94.jar包中又包含了符合JSR - 94 (javax.rules)的API。
docs/
這是一個文檔,以「index.html」為首頁的Jess手冊。.
examples/jess
一個包含使用Jess語言編寫的小程序的目錄.
examples/xml
一個包含使用JessML, Jess's XML規則語言編寫的小程序的目錄.
eclipse
JessDE, 是Jess集成開發環境, 提供支持Eclipse 3.0的插件集。看這里的安裝說明。
src (Optional)
如果這個目錄存在,它包含全部的Jess規則引擎和開發環境的源代碼,包括一個構建它的Ant腳本。
1.2.2.命令行界面
Jess有一個交互的命令行界面。分布包括兩個你能運行Jess命令提示符的腳本:其中一個用於Windows,另一個用於UNIX。它們兩個都在bin/ directory目錄下。運行適合你系統的那一個,然後你應該看到以下的界面:
C:\Jess71a2> bin\jess.bat
Jess, the Rule Engine for the Java Platform
Copyright (C) 2006 Sandia Corporation
Jess Version Jess71a2 9/5/2006
Jess>
這就是Jess的命令。嘗試計算一個前綴數學表達式"(+ 2 2)"。不要忘記那些括弧!
Jess> (+ 2 2)
4
Jess計算了此函數,並列印結果。在這份文檔的下一章,我們會發現Jess規則語言本身的語法。
通過Jess命令行執行Jess代碼編寫的文件,可以使用批處理命令:
Jess> (batch "examples/jess/sticks.clp")
Who moves first (Computer: c Human: h)?
在前面的例子應注意到,在Jess>提示符後鍵入命令,Jess將在下一行響應命令。我將在整個這本文檔中遵循本約定。
直接從操作系統提示符執行這樣的Jess程序,你可以把程序的名字作為Jess腳本的一個參數,這樣就可以啟動:
C:\Jess71a2> bin\jess.bat examples\jess\sticks.clp
Jess, the Rule Engine for the Java Platform
Copyright (C) 2006 Sandia Corporation
Jess Version Jess71a2 8/28/2006
Who moves first (Computer: c Human: h)?
jess.console類是一個簡單的jess命令行界面的圖形版。你在窗口的底部輸入一個命令,結果就會出現在滾動窗口之上。試著從Jess71a2路徑下鍵入下面命令:
C:\Jess71a2> java -classpath lib\jess.jar jess.Console
1.2.3.Java程序設計語言與Jess
要在你的Java程序中把Jess做為庫使用,文件jess.jar(在lib目錄下)必須是以一個標準的擴展名安裝在類路徑之下,或者對你的開發工具配置後能夠識別它。做好這些工作的細節是隨系統和環境而定的,但在設置一個類路徑時通常涉及修改環境變數,並且安裝一個標準的擴展名,簡單來說就是復制jess.jar到你的$(JAVA_HOME)/jre/lib/ext路徑下。可查閱Java文檔或介紹Java的文本以了解更多的細節。
1.2.4.Jess例子程序
有一些簡單的例子程序(在examples/jess和examples/xml目錄下),您可以用這些程序測試你的Jess是否已經安裝正確。這些程序包括fullmab.clp,zebra.clp和wordgame.clp。fullmab.clp是關於猴子與香蕉問題的經典版本。要從命令行運行它,只需要輸入:
C:\Jess71a2> bin\jess examples\jess\fullmab.clp
和要運行的問題,就會在屏幕上輸出結果。任何Jess代碼的文件都可以以這種方式運行。像使用批處理函數一樣在命令行給一個Jess文件名就可以運行了。因此,一般你只需要保證文件是以:
Jess> (reset)
(run)
結束或根本沒有規則將運行。zebra.clp和wordgame.clp程序是兩個典型的例子,它們是用來展示Jess如何處理復雜情況的程序。這些例子都產生大量的局部模式匹配,因此它們運行非常慢而且使用了大量的內存。另外的例子包括sticks.clp (互動游戲)和frame.clp (一個使用jess的java集成能力建立圖形界面的演示)。
XML的例子在單獨的子目錄下,每個子目錄中都包含有運行例子說明的自述文件。
2.Jess開發環境
Jess 7包括一個基於Eclipse的開發環境。這個開發環境有一個編輯器,一個調試器和一個Rete網路視圖。在將來發布的版本中將包含更多組件(規則瀏覽器和其它工具)。
2.1.安裝JessDE
Jess開發環境(JessDE)是作為一個插件集支持流行的開源的集成開發環境Eclipse;該插件支持Eclipse 3.1及其更新版本。應該注意的是JessDE僅僅工作在完全的" Eclipse SDK "上——較小的"二進制運行平台"是不能運行的。
安裝JessDE,首先要退出Eclipse,然後從Jess71a2/eclipse解壓縮所有文件到頂層的Eclipse的安裝路徑。確認在你的eclipse安裝目錄有一個名為" plugins/gov.sandia.jess_7.0.0 "的目錄存在,然後重新啟動Eclipse。
注意!如果你只是從以前的版本的JessDE更新,你必須在Eclipse的命令行使用"-clean "命令開關,強制更新緩存中有關JessDE插件的信息。如果你不這樣做,很多的JessDE的選項可能被禁用,安裝後你只需要這樣做一次。
2.1.1.驗證你的安裝
在「Help」菜單下選擇「about Eclipse SDK」。在" about Eclipse SDK "主窗口有一個有Jess標志的按鈕。單擊「Plug-in Details」,如果JessDE已安裝妥當,你將發現三個或四個Jess相關插件在列表上——在我的Eclipse中,它們出現在底部。
然後使用「New Project」向導建立一個Java工程。在新的工程中創建一個新文件並命名為「hello.clp」。這個文件會在一個Jess的編輯器中打開,這個編輯器有一個帶紅色「J」字的銀色小球的圖標。輸入一些Jess代碼,如下:
(printout t "Hello, World" crlf)
你應該看到合適的語法被高亮顯示。如果看到,祝賀你!工作一切正常!閱讀更多JessDE其他功能的信息。
2.1.2.更多的細節
JessDE編輯器在你的Jess文件中能夠標示出語法錯誤和警告。你很可能希望這些標記能出現在Eclipse的「Problems」視圖中,盡管在默認情況下它們可能沒有顯示出來。安裝完成JessDE後,重新啟動Eclipse,在Problems的視圖,在標題欄點擊「Filters」的圖標,然後選擇標著" Jess Problem "(如果沒有被選中的話)多選項。你的Problems視圖應該馬上就會顯示Jess錯誤和警告。
要使用Rete網路視圖,你需要安裝Eclipse圖形編輯框架(GEF)。你可以從Eclipse工程項目頁面得到GEF,或通過Eclipse的內置式更新管理器安裝它。然後打開這一視圖,在「Jess Debugger」組之下Eclipse的「Show view」對話框找到它。那麼在Jess編輯窗口中當游標停在某一內部規則時,Rete網路視圖將會為這項規則顯示出編譯的網路。
2.2.使用JessDE
2.2.1.Jess語言編輯器
JessDE編輯器可以編輯「.clp」格式的文件。在默認情況下你建立的任何 「.clp」格式的文件都將使用JessDE編輯器打開。沒有單獨Jess的視圖,或是Jess項目類型;我們期望大多數人都將使用JessDE工具來寫Jess/Java混合應用組成的Jess程序,因此JessDE工具將用在Java項目的文件中。在Jess語言代碼中JessDE使用你的Java項目的類路徑以解決Java中類名稱問題——例如,調用defclass函數。
編輯器有您期望的一個現代程序編輯器所應具有的全部功能。
可定製的語法變色
你可以使用Eclipse全局參數對話框中的「Jess Editor」表來改變默認的顏色。
提供模板,槽和函數名的幫助內容
在許多不同地方使用JessDE編輯器你可引用Eclipse的" Content Assist "功能;JessDE將使輸入Jess代碼變得更容易。在輸入時可以使用快捷鍵Alt-' / '彈出選擇列表清單。
自動修復代碼的「Quick fix」助手
這個功能默認使用Ctrl-1快捷鍵,快速匹配能立即知道怎樣定義未定義的deftemplates,並為現有的deftemplates(如果它們在相同的文件里被定義)增加新的槽。
實時錯誤檢測標記和錯誤高亮顯示
當你輸入有錯誤和警告時將被高亮顯示
代碼自動格式化
當你輸入時代碼自動縮進。你可以從"Source"菜單下選擇"Format"命令來格式化一個全部的緩沖區
使用大綱視圖快速導航
Eclipse大綱視圖列出了所有在緩沖區中定義的結構;你可以點擊其中任何一個就能夠迅速定位到它
圓括弧匹配和自動插入
當你輸入一個'('或』」』符號,JessDE就會插入匹配的符號。當你的游標移動到下一個圓括弧時,JessDE會顯示與之相匹配的圓括弧。
通過懸停獲得Jess函數和結構在線幫助
快速訪問Jess手冊中每一個函數和結構類型的描述。
支持deftemplates 和 deffunctions的懸停幫助
如果你將你的滑鼠移動到一個deftemplate或deffunction的名字上,任何代碼處,JessDE都將顯示一個關於這個模板或函數信息的"tooltip"。
Jess程序的運行和調試命令
你可以使用正常Eclipse 的" Run... "菜單或由右擊導航項或在編輯窗口運行或調試Jess程序。
2.2.2.文件之間的關聯
有時候一個*.clp文件依靠其他的*.clp文件中的代碼先被閱讀執行。例如,rules.clp 也許需要templates.clp中的定義。沒有這些定義,rules.clp將會出現語法錯誤。為了解決這個問題,你可以使用require*函數。"require*"讓你清楚的聲明這些關聯。
如果一個文件rules.clp依靠在Java中執行的Jess命令,你可以僅僅為了這個目標創建一個特殊的文件處理這個問題(你也許稱之為ruledepends.clp),這個特殊的文件包括了編輯器中使rule.clp文件能夠正確解析的所有聲明。如果你添加"(require* ruledepends)"到rules.clp中,僅當這個外部文件存在的話才會解析,因為它有可能正在開發中。當你部署代碼時,你不需要部署ruledepends.clp,只要rules.clp能夠從Java代碼中取得所需聲明。
"require"機制代替了JessDE的早期版本中的"Source dependencies"屬性表,"Source dependencies"屬性表已不再被支持。
2.2.3.Rete網路視圖
使用JessDE的"Rete Network View"你可以即時看到一個衍生自任何規則的Rete網的圖形展示。當這個視圖是打開時(你可以使用Eclipse中的"Windows | View | Other..."對話框打開它),它會顯示基於編輯器插字元所在規則的Rete網路,你可以用這個實時看到修改規則所對應的Rete網路變化。圖表的布局方式是遠勝於你能從Jess視圖命令中得到的----因為這樣沒有重疊和交叉線,而且每一列的高度都可變。
2.2.4.Jess調試器
JessDE調試器可以讓你調試一個在.clp文件中定義的Jess程序。它具有您期望的圖形調試器所具有的所有功能:你可以暫停和恢復程序,或以步進方式執行。當程序停止時,執行堆棧的內容將會顯示出來,這樣你就可以檢查在每個堆棧結構中定義的變數。選擇的堆棧結構也可以導航到被執行的源碼處。在編輯器窗口的左手邊緣處,你可以通過右鍵單擊某一規則在任何.clp文件中設置(或清除)斷點。斷點僅能設在函數(內置或用戶自定義)中,所以你不能在defrule 或者deftemplate結構中打斷程序執行。然而,你能夠在一個調用規則 的左邊或右手邊的函數中暫停。
3.Jess 語言基礎
大多數時間你是在使用Jess語言編寫Jess規則。如果你從來沒有使用過Lisp,第一次使用Jess規則語言也許看起來就有點奇怪了,但它並不需要太長時間來學習。回報也是豐厚的,你將使用非常少的代碼表達復雜的邏輯關系。
在這一章,我們將看到Jess語言的基礎語法。在後面的章節中,我們再來學習怎樣定義像事實與規則這樣的高級概念,但現在我們將學習最基礎的。
在本語言指導中,我將使用一個非正規的符號來描述語法。在< >中的基本串是必須提供的數據類型,在方括弧中([])的內容是可選的,以 + 結束表示可以出現一次或多次,以 * 結束表示可以出現零次或更多。一般來說, Jess的輸入格式是自由的。換行不具有特殊的含義,僅被處理為空格,而異常將被標識。
3.1.符號
符號是Jess語言的一個核心概念。符號是非常類似於其他語言中的標識符。Jess符號包括字母,數字和下面的標點符號:$*=+/<>_?#.。一個符號不能以數字開始,可以以一些特殊的標點符號開始(這些字元作為操作員當出現在符號開始時有著特殊的意義)
Jess符號對於大小寫敏感。foo,FOO,和Foo是不同的符號。
最佳的符號是由字母,數字,下劃線和破折號組成。破折號是傳統的分隔符。如下所示為合法的符號:
foo first-value contestant#1 _abc
Jess中有三種特殊的符號。零,和java中的空值有點類似;真和假是Jess中的布爾類型的值。
3.2.數字
Jess分別使用Java函數parseInt(java.lang.String), parseLong(java.lang.String)和parseDouble(java.lang.String)來解析整型,長整型和浮點型數字。參考本文檔中關於這些方法精確的語法描述。如下為合法的數字:
3 4. 5.643 5654L 6.0E4 1D
3.3.字元串
Jess中的字元串是用雙引呈來標識的(").。反斜線能夠區分嵌入的引號。注意Jess的字元串和Java的字元串在一些重要的地方是不一樣的。首先,不會認識轉義序列。比如說你不能用一個"\n"字元串來換行。另一方面,真正的換行可以通過雙引號中的字元串來實現。他們是字元串的一部分。如下為合法的字元串:
"foo" "Hello, World" "\"Nonsense,\" he said firmly." "Hello,
There"
最後一個字元串相當於Java中的字元串"Hello,\nThere".。
3.4.列表
Jess中的另一個基礎語法元素是列表。列表是由圓括弧和空,符號,數字,字元串和其他列表組成。如下所示為合法的列表:
(+ 3 2) (a b c) ("Hello, World") () (deftemplate foo (slot bar))
Jess中列表的第一個元素(Lisp中稱為列表的car)通常被稱列表的頭。
3.5.注釋
Jess支持兩種類型的程序注釋。Lisp風格的行注釋和C風格的塊注釋。行注釋是以分號開頭,延伸到文本中本行的最後。這里有一個行注釋的例子:
; This is a list
(a b c)
塊注釋就和他們在C語言中的用法一樣:他們以兩個特徵符"/*"開始,以"*/"結束。塊注釋不能嵌套。
/*
Here is an example of a list (commented out):
(a b c)
*/
注釋可以在Jess程序的任何地方出現,包括模板和規則的結構里。
3.6.函數調用
和Lisp一樣,Jess中的所有代碼(控制結構,分配,程序調用)都是以函數調用的方式進行的。沒有操作器,一切都是函數調用。然而,有些函數的名字使它們看起來像是Java操作器,在這種情況下,它們就和它們的Java 副本工作的非常相似。
Jess中的函數調用可以理解為簡單的列表。函數調用採用前綴表示,如果一個列表的頭部是一個已經存在的函數的符號,那麼它就可以稱為是一個函數調用。舉例來說,用+函數來算2和3相加的表達式應該寫為(+ 2 3)。在計算時,這個表達式的結果是數字5(不是一個僅包含數字5的列表!)。通常來說,在合適的時候表達式都被看作是這樣並通過上下文求值。你可以在Jess>提示符後鍵入表達式。Jess計算表達式並列印出結果:
Jess> (+ 2 3)
5
Jess> (+ (+ 2 3) (* 3 3))
14
注意你可以嵌套調用函數;外部函數是形成內部函數調用計算的因素。
Jess自身帶有大量的內置函數,它們可以用來做一切事情,如數學計算,程序控制和字元處理,讓你能夠使用Java的API函數。當然你也可以在Jess語言或者是Java語言中定義自己的函數。
其中一個最經常用的函數是printout,它是用來發送文本到Jess的標准輸出窗口,或者是輸出到一個文件中。完善的解釋你必須等待,但是現在,你所要了解的都包含在下面這個例子中:
Jess> (printout t "The answer is " 42 "!" crlf)
The answer is 42!
另一個常用的函數是batch,它是用來計算一個包含Jess代碼文件的。要運行Jess源文件examples/jess/hello.clp,你可以鍵入:
ess> (batch "examples/jess/hello.clp")
Hello, world!
Jess自帶的其他的所有函數的詳細說明都在Jess function guide.。
3.7.變數
Jess中程序變數是以問號開始的標識符。問號也是變數名的一部分。名字可以包括字母,數字,破折號,下劃線,分號和星號的任何組合。
一個變數可以看作是一個簡單的符號,數字,字元串或者是一個列表。你可以用bind函數來為變數指定一個值。
Jess> (bind ?x "The value")
"The value"
變數在第一次使用前不需要聲明(全局變數除外)。
想在Jess提示符後看到變數 的值,你只需要鍵入變數的名字:
Jess> (bind ?a 123)
123
Jess> ?a
123
3.7.1.全局變數(默認全局)
你在Jess提示符後或者任何Jess語言程序頂層創建的所有變數, 當重置命令運行的時候都將被清除。這樣就使它們稍嫌短暫,對於暫時性變數它們很好用,在標准理解的前提下不是永久全局變數。要創建不被reset銷毀的全局變數,你可以用全局結構:
(defglobal [?<global-name> = <value>]+)
全局變數的名稱必須是以星號開頭以星號結束。合法的全局變數如下:
?*a* ?*all-values* ?*counter*
當全局變數建立以後,它會被初始化賦值。當reset命令隨後執行的時候,這個變數可能會用相同的值重新設置,當然這取決於reset-globals的屬性設置。有一個稱為set-reset-globals的函數可以用來設置這個屬性。如例所示:
Jess> (defglobal ?*x* = 3)
TRUE
Jess> ?*x*
3
Jess> (bind ?*x* 4)
4
Jess> ?*x*
4
Jess> (reset)
TRUE
Jess> ?*x*
3
Jess> (bind ?*x* 4)
4
Jess> (set-reset-globals nil)
FALSE
Jess> (reset)
TRUE
Jess> ?*x*
4
您可以閱讀Jess function guide.中有關set-reset-globals和相關的get-reset-globals函數的信息。
3.8.控制流
Java中控制流(分支和循環,異常處理等)都是由一些特殊的語法和關鍵字如if,while,for,和try等來引導的。在Jess中,就如我們前面說過的,所有的一切都是函數調用,控制流也不例外。因此,Jess包含有那些名為if,while,for,和try以及foreach等函數。這些函數就和Java體系中相同名稱的結構工作起來類似。
3.8.1.簡單循環
例如,如下 是Jess中的一個「while」循環示例:
Jess> (bind ?i 3)
3
Jess> (while (> ?i 0)
(printout t ?i crlf)
(-- ?i))
3
2
1
FALSE
While循環的第一個參數是一個布爾表達式。While函數計算它的第一個參數,如果它為真,就計算它所有其他的參數。它一直進行這個過程直到它的線一個參數值為假。一個while循環總是返回FALSE.
Jess中內置有一些其他的循環函數。詳情參看Jess function index.中關於for和foreach的有關描述。Jess中有一個break函數,可以有來跳出循環,也可以很早的從一個規則的右手邊返回
//原文地址http://javawei.blog.163.com/blog/static/587005262008612102128488/
10. 規則引擎的VisualRules
規則引擎是外部Java程序調用規則包的一組Java類,其包含在engine.jar中。 外部Java程序調用規則包時只需要用到兩個類。一個是 com.flagleader.engine.RuleEngine 。另一個是 com.flagleader.engine.RuleEngineFactory 。
RuleEngineFactory是得到規則引擎實例的工廠類。 通常代碼為
RuleEngine ruleEngine = RuleEngineFactory.newInstance().getRuleEngine();
得到規則引擎實例後,可以調用規則引擎中的方法,主要是put、excute和get這三個方法。 put用於傳入需要傳入的值,excute用於運行指定的規則包,get用於得到傳出的值。 一般的調用代碼為:
ruleEngine.put(傳入對象);
ruleEngine.excute(規則包調用名);
傳出對象 = ruleEngine.get(傳出對象名);
因此外部程序調用規則包非常簡單。只需以上幾行代碼就可以完成應用。