日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Drools 5.1.1(一)

發布時間:2024/4/17 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Drools 5.1.1(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?http://shikonglaike.iteye.com/blog/1236354

第一章歡迎

我總是和終端業務用戶爭論不休,理解規則和流程、最新規則和事件處理的區別。對此,在他們的意識中有這樣的問題,并且他們希望使用某些軟件模擬它。使用兩個供應商提供的傳統方式,強迫業務用戶與一個剛剛獲得方式的面向流程或面向規則的方法一起工作,他們將使用該工具模擬這點,往往整體是極為混亂的。

PegaSystems和Microsoft做了大量的工作,顯示兩者可以被結合,并且可以使用一個行為的模擬方法。這讓業務用戶更自然地應用提供給他們的各種方法工作,不必使用獲得方式的工具。從面向流程到面向規則或中間的灰色地帶——任何當時的相應問題被模擬。

Drools5.0更進了一步,不僅增加了基于工作流與Drools流的BPMN2,而且增加了事件處理與DroolsFusion(熔合),為軟件開發者創建了一個更全面的方法。此處的術語“全面的”被用來強調整體和它局部間的相互依賴性的重要性。

Drools5.0現在被劃分為5個模塊,每個都自帶手冊——Guvnor(BRMS/BPMS),Expert(Rules),Fusion(CEP),Flow(Process/Workflow)和Planner。Guvnor是我們的基于網頁的管理系統,在規則世界中傳統提及的,如一個BRMS(商業規則管理系統)。我們決定拋棄一個擔當管理工作的BRMS術語,因為它不是規則的細節。Expert是傳統的規則引擎。Fusion是事件處理邊,它擔當數據/傳感器的熔合術語。Flow是我們的工作流模塊,由KrisVerlaenen領導,已經做了一些了不起的工作;他正把流與jBPM5合成一體。第5個模塊是Planner,由GeoffreyDeSmet撰寫,解決分配和調度類型的問題。雖然還處在開發的初期階段,但已顯示了許多期望。我們希望為2011版增加Semantics(語義),基于描述邏輯,并讓它擔當下一代Drools引擎的一部分。

我一直工作在規則領域,現在大約7年了。我終于感覺到我緊握東西,想法開始成形,并且真正的創新開始出現。對我來說,感覺就象我確實知道我們現在將做什么,與過去相比,有許多瘋狂的猜想和探索。我與EdsonTirelli和DavideSottara一起努力工作在DroolsExpert設計文檔上。我邀請你閱讀文檔和參與http://community.jboss.org/wiki/DroolsLanguageEnhancements。該文檔帶有東西給下一級,推動Drools成為一個混合的引擎,不僅是一個有能力生產規則的系統,而且混合了邏輯編程(prolog)與功能編程,以及帶有其他想法的更有表現力和現代感語言的描述邏輯。

我希望你能感覺到我們的團隊和我在Drools上工作的熱情,希望在你的冒險期間能感染你。

MarkProctor(Drools創建者和領導)

第二章Drools發行說明

2.1在Drools5.1.0中,值得注意的新東西。

?

2.1.1DroolsAPI

如在Drools5.0中一樣,仍然可以使用配置配置一個KnowledgeBase(知識庫),通過一個xml改變集合(changeset),而不是編程方式。然而,現在的change-set命名空間被版本化了。這意味著,在Drools5.1.0中,1.0.0xsd應該被引用。

例子2.1下面是一個簡單的版本1.0.0改變集合

<change-setxmlns='http://drools.org/drools-5.0/change-set'

xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'

xs:schemaLocation='http://drools.org/drools-5.0/change-setchange-set-5.0.xsdhttp://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.0.xsd'>

<add>

<resourcesource='classpath:org/domain/someRules.drl'type='DRL'/>

<resourcesource='classpath:org/domain/aFlow.drf'type='DRF'/>

</add>

</change-set>

?

2.1.2核心

?

2.1.2.1JMX監控

JMX監控被添加來支持知識庫監控。這尤其重要,象一個常需要事件處理的長期運行流程。初始化整合JOPR也被添加。JMX可以被啟用,使用屬性設置知識庫:

drools.mbeans=<enabled|disabled>或者這個選項在運行時啟用:

kbaseConf.setOption(MBeansOption.ENABLED)

2.1.2.2Spring

Drools現在有擴展的Spring支持,XSD可以在drools-springjar中發現。命名空間為"http://drools.org/schema/drools-spring"。

例子2.2知識庫構建器例子

?

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:drools="http://drools.org/schema/drools-spring"

xmlns:camel="http://camel.apache.org/schema/spring"

xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://drools.org/schema/drools-springhttp://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-container/drools-spring/src/main/resources/org/drools/container/spring/drools-spring-1.0.0.xsd

http://camel.apache.org/schema/springhttp://camel.apache.org/schema/spring/camel-spring.xsd">

<drools:resourceid="resource1"type="DRL"source="classpath:org/drools/container/spring/testSpring.drl"/>

<drools:kbaseid="kbase1">

<drools:resources>

<drools:resourcetype="DRL"source="classpath:org/drools/container/spring/testSpring.drl"/>

<drools:resourceref="resource1"/>

<drools:resourcesource="classpath:org/drools/container/spring/IntegrationExampleTest.xls"type="DTABLE">

<drools:decisiontable-confinput-type="XLS"worksheet-name="Tables_2"/>

</drools:resource>

</drools:resources>

<drools:configuration>

<drools:mbeansenabled="true"/>

<drools:event-processing-modemode="STREAM"/>

</drools:configuration>

</drools:kbase>

</beans>

知識庫接受下面的配置:"advanced-process-rule-integration,multithread,mbeans,event-processing-mode,accumulate-functions,evaluatorsandassert-behavior"。

?

根據kbase參考可以創建ksessions

例子2.3知識會話

<drools:ksessionid="ksession1"type="stateless"name="stateless1"kbase="kbase1"/>

<drools:ksessionid="ksession2"type="stateful"kbase="kbase1"/>

象知識庫的知識會話可以接受一些配置,包括"work-item-handlers,"keep-references","clock-type","jpa-persistence"。

例子2.4知識會話的配置

<drools:ksessionid="ksession1"type="stateful"kbase="kbase1">

<drools:configuration>

<drools:work-item-handlers>

<drools:work-item-handlername="handlername"ref="handlerid"/>

</drools:work-item-handlers>

<drools:keep-referenceenabled="true"/>

<drools:clock-typetype="REALTIME"/>

</drools:configuration>

</drools:ksession>

StatefulKnowledgeSessions(有狀態知識會話)可以被配置為JPA持久化

?

例子2.5JPA配置用于StatefulKnowledgeSessions

<beanid="ds"class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<propertyname="driverClassName"value="org.h2.Driver"/>

<propertyname="url"value="jdbc:h2:tcp://localhost/DroolsFlow"/>

<propertyname="username"value="sa"/>

<propertyname="password"value=""/>

</bean>

<beanid="myEmf"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

<propertyname="dataSource"ref="ds"/>

<propertyname="persistenceUnitName"value="org.drools.persistence.jpa.local"/>

</bean>

<beanid="txManager"class="org.springframework.orm.jpa.JpaTransactionManager">

<propertyname="entityManagerFactory"ref="myEmf"/>

</bean>

<drools:ksessionid="jpaSingleSessionCommandService"type="stateful"kbase="kbase1">

<drools:configuration>

<drools:jpa-persistence>

<drools:transaction-managerref="txManager"/>

<drools:entity-manager-factoryref="myEmf"/>

<drools:variable-persisters>

<drools:persisterfor-class="javax.persistence.Entity"implementation="org.drools.persistence.processinstance.persisters.JPAVariablePersister"/>

<drools:persisterfor-class="java.lang.String"implementation="org.drools.container.spring.beans.persistence.StringVariablePersister"/>

<drools:persisterfor-class="java.io.Serializable"implementation="org.drools.persistence.processinstance.persisters.SerializableVariablePersister"/>

</drools:variable-persisters>

</drools:jpa-persistence>

</drools:configuration>

</drools:ksession>

知識庫會話可以支持啟動批處理腳本,前面的版本使用"script"元素名,它將被更新為"batch"。下面的命令被支持:"insert-object","set-global","fire-all-rules","fire-until-halt","start-process","signal-event"??梢允褂媚涿鸅ean或命名"ref"屬性。

例子2.6啟動批處理命令

?

<drools:ksessionid="jpaSingleSessionCommandService"type="stateful"kbase="kbase1">

<drools:script>

<drools:insert-objectref="person1"/>

<drools:start-processprocess-id="procname">

<drools:parameteridentifier="varName"ref="varRef"/>

</drools:start-process>

<drools:fire-all-rules/>

</drools:script>

</drools:ksession>

?

在Spring中支持執行節點(ExecutionNodes),它們提供了一個注冊的ksessions。它可以與Camel一起提供ksessions路由。

2.1.2.3Camel

Spring可以與Camel組合,提供聲明式規則服務。一個Camel策略從Drools被添加,Drools提供魔法注入類加載器(ClassLoader),類加載器被ksession用于任何數據的格式化,它還增強了JAXB和XStream數據的格式化。假如在Jaxb情況下,它添加另外的Drools路徑信息,利用XStream注冊Drools相關聯的轉換器,并取別名。

你可以使用不同的地址,創建你需要的盡可能多的端點。需要CommandMessagBodyReader分配有效負荷給Camel處理。

例子2.8Rest端點配置

<cxf:rsServerid="rsServer"

address="/kservice/rest"

serviceClass="org.drools.jax.rs.CommandExecutorImpl">

<cxf:providers>

<beanclass="org.drools.jax.rs.CommandMessageBodyReader"/>

</cxf:providers>

</cxf:rsServer>

然后,Camel路由可以連接到CXF端點,允許你控制如數據的格式化和根據Droolsksessions執行等事情的有效負荷。Drools策略增加某些智能給路由。如果使用JAXB或XStream,它將注入定制路徑和轉換器,它也可以在服務器邊設置類加載器,基于目標ksessions的。在客戶邊,它自動解包Response(響應)對象。

?

這個例子使用了一個增強的XStream的數據格式解組有效負荷,并且根據ksession1實例執行它。"node"在這兒引用了ExecutionContext(執行上下文),它是一個注冊的ksessions上下文。

例子2.9Camel路由

<beanid="droolsPolicy"class="org.drools.camel.component.DroolsPolicy"/>

<camelContextid="camel"xmlns="http://camel.apache.org/schema/spring">

<route>

<fromuri="cxfrs://bean://rsServer"/>

<policyref="droolsPolicy">

<unmarshalref="xstream"/>

<touri="drools://node/ksession1"/>

<marshalref="xstream"/>

</policy>

</route>

</camelContext>

Drools端點"drools:node/ksession1",由執行節點名字、分隔符和可選的知識會話名字構成。如果知識會話沒有指定路由,會查找在輸入的有效負荷的實例中的"lookup"屬性,或者在頭部屬性"DroolsLookup"中去查找。

2.1.2.4Drools服務器

Spring,Camel和CXF可以被組合,用于聲明式服務,drools-server是一個.war,組合了它們與某些開箱即用的例子xml,就像一類模板。如果你正在jboss容器中使用war,,那么你需要添加這個組件,http://camel.apache.org/camel-jboss.html。該war包含了一個test.jsp,顯示一個象你開始的例子一樣的回顯。這個例子只是執行一個簡單的"echo"類型的應用程序。它發送一個消息到規則服務器,規則服務器預先增加單詞"echo"到開頭,并發送它回去。默認時,消息是"HelloWorld",使用url參數msg——test.jsp?msg="MyCustomMessage",可以傳遞不同的消息。

?

2.1.2.5知識代理增量變化支持

新版的知識庫代理在它配置中支持newInstance=false(增量變化集合構建)。

?

當設置這個屬性為false,知識庫代理使用存在的知識庫參考應用增量變化。現在知識庫代理可以用增量的方式處理監控的資源更改。更改的定義被編譯,并和原始版本比較。根據定義的類型,以不同的方式表現:

l?Rules:用于規則,代理搜索在它的屬性中的更改,左手邊和右手邊。

l?Queries:查詢總在kbase上被替代,無論它們被更改還是沒有被更改。

l?其他定義:所有其他定義總是在kbase中被替代(只要它們被更改)。我們希望在將來的版本中,為更改定義的探測增加更好的支持。

當前的實現只支持規則、查詢和函數定義的探測。類型聲明不能被探測。

2.1.2.6會話檢查與報告框架

一個用于運行時會話檢查與報告的基于框架的新的API被引入,從而更好地在調試或應用程序成型時采集數據。這個檢查框架將成為加工功能的基礎,用來幫助為每個會話的內容提供更詳細的信息。這個api是實驗性的,并不是用在drools-api中,但可自由的使用,并幫助我們改進它。

要檢查一個會話,可以使用以下api調用之一:

例子2.10創建一個會話檢查器

StatefulKnowledgeSessionksession=...

//...insertfacts,firerules,etc

SessionInspectorinspector=newSessionInspector(ksession);

StatefulKnowledgeSessionInfoinfo=inspector.getSessionInfo();

StatefulKnowledgeSessionInfo實例將包含許多在會話分析期間采集的相關數據。提供了一個簡單的例子報告模板,并且可以利用下面的api調用產生:

例子2.11產生一個報告

Stringreport=SessionReporter.generateReport("simple",info,null);

?

2.1.3Expert

2.1.3.1差異更新

傳統Rete算法用retract+assert(撤消+斷言)做一個更新,對一個給定的事實,這導致所有的局部匹配被撤銷,然而,在assert(斷言)期間,其中一些會被再次重建;因為它們在更新前為true,并且在更新后仍然為true。這導致許多不需要的對象被摧毀,并且這些行為增加了垃圾收集器的負荷?,F在的更新是一個單程,并在適當的位置檢查局部匹配,避免不必要的局部匹配被摧毀。經歷事件和實事維護的一個正規化過程也不再需要;正規化過程是我們準備著眼于激活retract(撤消)的地方,被插入的激活斷定真正被添加的東西,由真正插入的東西確定“差異”。

?

2.1.3.2Channels(通道)

退出點已經用更合適的名字Channels(通道)替代,我們覺得它更合適,因為多個規則引擎可以使用它們,并且不是切入點的精確對立面。切入點明顯與進入Rete網絡中的一個分區有關聯。

2.1.3.3現場查詢

Doorls一直有一個查詢支持,但結果是以一個可迭代的集合返回;這使監測隨著時間的變化很困難。

?

我們現在用現場查詢實現它,它與一個偵聽器相連,而不是返回一個可迭代的集合。這些現實查詢持續打開創建的一個視圖,并且為這個視圖的內容發布變化事件。所以,你現在可以執行你的查詢,利用參數,并在結果視圖中偵聽變化。

?

例子2.12實現ViewChangedEventListener

?

finalListupdated=newArrayList();

finalListremoved=newArrayList();

finalListadded=newArrayList();

?

ViewChangedEventListenerlistener=newViewChangedEventListener(){

publicvoidrowUpdated(Rowrow){

updated.add(row.get("$price"));

}

?

publicvoidrowRemoved(Rowrow){

removed.add(row.get("$price"));

}

?

publicvoidrowAdded(Rowrow){

added.add(row.get("$price"));

?

}

};

?

//OpentheLiveQuery

?

LiveQueryquery=ksession.openLiveQuery("cheeses",newObject[]{"cheddar","stilton"},listener);

...

?

...

query.dispose()//makesureyoucalldisposewhenyouwantthequerytoclose

?

?

一個Doorls博客文章包含了一個用于現場查詢的Glazed列表集成的例子

?

http://blog.athico.com/2010/07/glazed-lists-examples-for-drools-live.html(不可用)

?

[http://planet.jboss.org/view/post.seam;jsessionid=8F25E6F156E3093608A38BDCCE17369C?post=glazed_lists_examples_for_drools_live_querries]

?

2.1.3.4定時器和日歷

規則現在支持基于interval(間隔)和cron定時器,替代了過時的duration(期限)屬性。

例子2.13定時器屬性使用的例子

timer(int:<initialdelay><repeatinterval>?)

timer(int:30s)

timer(int:30s5m)

timer(cron:<cronexpression>)

timer(cron:*0/15***?)

?

Interval"int:"定時器遵守JDK語義,初始化延遲,緊跟一個可選的重復間隔。Cron"cron:"定時器遵守標準的cron表達式:

?

例子2.14一個Cron例子

rule"SendSMSevery15minutes"

timer(cron:*0/15***?)

when

$a:Alarm(on==true)

then

channels["sms"].insert(newSms($a.mobileNumber,"Thealarmisstillon");

end

當規則被引發時,現在可以控制日歷。日歷api是模擬Quartzhttp://www.quartz-scheduler.org/:

例子2.15調節一個Quartz日歷

CalendarweekDayCal=QuartzHelper.quartzCalendarAdapter(org.quartz.CalendarquartzCal)

日歷使用StatefulKnowledgeSession(有狀態知識會話)注冊:

例子2.16注冊一個日歷

ksession.getCalendars().set("weekday",weekDayCal);

它們可以同時用于普通規則和包含定時器的規則中。規則的calendar屬性可以有一個或多個逗點日歷名字:

例子2.17一起使用日歷和定時器

rule"weekdaysarehighpriority"

calendars"weekday"

timer(int:01h)

when

Alarm()

then

send("priorityhigh-wehaveanalarm);

end

?

rule"weekendarelowpriority"

calendars"weekend"

timer(int:04h)

when

Alarm()

then

send("prioritylow-wehaveanalarm);

end

2.1.3.5決策表(Excel)

2.1.3.5.1簡單模板,用于單元格內部可變長度逗點分隔的列表

在一個單元格中可以有一個逗點分隔的列表,并且用一個forall模板可以渲染它們。

例子2.18DTableforall語法

forall(<separator>?){<codesnippt>}

例子2.19DTableforall例子

forall(,){propertyName==$}

forall(&&){propertyName==$}

forall(||){propertyName==$}

forall(||){propertyNameA==$}&&forall(||){propertyNameB==$}

等等

2.1.4Flow

2.1.4.1BPMN2

正如我們早期已宣稱的一樣,Dools團隊已決定支持使用XML指定業務流程的即將到來的BPMN2.0規范。這個里程碑包含了BPMN2解析器的重大擴展,使用DroolsFlow來支持BPMN2的更多功能。更具體的有:

?

l?更廣泛的事件支持:更多的事件類型組合(開始、中間、結束)和事件觸發(例如,包括錯誤、升級、定時器、條件、信號事件),以及已包括(中斷和非中斷)邊界事件。

l?子流程參數。

l?發散的綜合性出入口

l?等等

BPMN2已被集成在完整的Dools工具鏈中,支持業務流程的整個生命周期。它包括:

?

l?能夠與我們的Eclipse工具一起使用BPMN2流程。

l?Guvnor作為流程庫。

l?基于網頁的管理,使用BPM控制臺。

l?審計和調試。

l?特殊域流程。

l?等等

因此,DroolsFlow不僅是一流的開源流程引擎,天然地支持這樣一個重要的BPMN2結構集合,而且我們的面向知識的方法,也允許你容易組合你的BPMN2流程與業務規則,以及復雜的事件處理,完全使用相同的APIs和工具。

2.1.4.2基于網頁的管理控制臺

現在也可以通過一個網頁控制臺管理DroolsFlow流程。它包括的功能有:管理你的流程實例(開始/停止/檢查),檢查你的(人的)任務列表,執行那些任務,產生報表。

?

這個控制臺實際上是HeikoBraun的工作(卓越的),他創建了一個通用的BMP控制臺,可以被用來支持多種流程語言。我們實現了必要的組件,允許這個控制臺能與DroolsFlow引擎通信。

2.1.4.3可插式可變持久化

DroolsFlow可以持久化運行流程的運行時間狀態到一個數據庫(所以它們完全不需要在內存,并且在故障情況時可以被存儲)。我們的默認持久化機制是用一個二進制對象(利用相關的元數據)存儲關聯于一個流程實例的所有運行時間信息。關聯這個流程實例(又名流程實例變量)的數據也作為這個二進制對象的一部分被存儲。然而這可以產生問題(1)在數據沒有被序列化時,(2)當用流程實例狀態的部分持久化,對象太大時,或者(3)在其他地方已經被持久化時。為此,我們實現了可插式可變持久化,用戶可以定義多少變量的值被存儲。例如,它允許你存儲個別變量的值,并且支持JPA實體被分別存儲和引用(避免狀態重復)。

2.1.4.4改進的流程實例移植

隨著時間的推移,流程可以進化。每當一個流程更新,確定已經運行的流程實例會發生什么是重要的。我們改進了我們的支持,用于移植運行的流程實例到流程定義的一個新版本。更多信息請看DroolsFlow文檔。

2.1.4.5安裝腳本

Drools構建輸出了一個安裝器,它簡化了Guvnor和gwt-控制臺的Eclipse插件的安裝。它創建了和復制了需要的jars和war,并且布置它們到JBossAS。它也包含了一個簡單的求值流程例子,你可以用它測試你的安裝。更多信息,下載Drools安裝器,請看其內部的自述文件readme。

?

2.1.5Guvnor

?

外觀已被清潔,例如少了彈出窗口。意味著用斷言和有關行為發生的信息更改之后的節省,以及如果出錯時,更好的錯誤報告。

?

2.1.5.3討論

?

注釋是在下面的“文檔”部分(當然是可選的)(并且有一個Atom供應給它們)



圖2.1實時討論

?

一個"backchannel(反向通道)"類型連接,保持了對瀏覽器的開放,允許消息推回——這意味著(在啟用時)信息實時顯示(和其他便利的事情一樣,如果某東西添加到一個列表——列表就會被更新)

?

2.1.5.4收件箱

?

收件箱功能提供了這樣的能力,跟蹤你打開或編輯的東西——這顯示在主導航器中的"Inbox"項目下。

?

?

圖2.2收件箱分類

?

?

l?最近打開的

?

點擊recentlyopened條目,會打開“最近”打開過的所有項目的一個列表(它跟蹤最近你看過的數百個項目)。

?

l?最近編輯的

?

所有你保存過的項目,或者注釋,將馬上顯示在這里。

?

l?收到的更改

?

它跟蹤“其他人”對“你”的“最近編輯”列表中的項目所做的更改。當你打開這些項目,那么它們會從這個列表中刪除(但仍然保留在你最近編輯過的列表中)

?

圖2.3收件箱項目列表。

?

2.1.5.5批量導入器

?

Guvnor導入器是一個maven構建工具,遞規你的規則目錄結構,并且構建一個導入文件,通過import/export管理功能可以手動導入它到Drools-Guvnor網頁界面。

?

2.1.5.6DroolsDoc

?

PDF文檔包含了有關包和每個DRL資產(asset)的信息。DroolsDoc作為知識包可以從"InformationandimportantURLs"下的包視圖(packageview)下載。

?

2.1.5.7更新為GWT2.0

?

GWT被更新,使DroolsGuvnor更快。

?

2.1.5.8安裝選擇器

?

安裝選擇器允許用戶選擇什么樣的資產構建,依據:

?

n?狀態(例如,開發,質量保證等)

n?分類

n?元數據

?

2.1.5.9單資產驗證

?

只要是你正在運行的資產(規則流、規則、決策表),就可以驗證。驗證發現諸如在一個規則中的沖突限制或在決策表中的多余行等問題。

?

2.1.5.10全局區



儲存在全局區的資產可以被所有包共享。

?

2.1.5.11快照之間的差異檢查

?

列出兩個快照之間的變化。

?

2.1.5.12在一個標簽中查看多個資產

?

可以在一個視圖中打開多個資產。所有的資產可以作為一個組被保存和編輯。

?

2.1.5.13From/Collect/Accumulate支持

?

指導編輯器已基本支持From,Accumulate和Collect模式。你可以添加它們中的任何一個結構作為正規模式。新的表達式構建器組件被創建,增加了對嵌套方法調用的一個變量支持。在規則的WHEN部分頂部使用了“加”按鈕,或者使用呈現在每個模式中的新的“在后面增加”按鈕,將打開彈出,添加新的條件元素到你的規則中。在可能元素的列表中的,你會發現三個新的條目:”From”,“FromAccumulate”和“FromCollect”。

?

當你添加一個新的”From”元素,你會在指導編輯器看到下面這樣圖象的東西。左邊模式的”From”條件元素是一個正規模式。你可以在這里添加你希望的任何類型的條件元素。右邊部分的”From”模式是一個表達式構建器。

?

圖2.4來自一個CE構建器

?

當你在左邊模式中使用“FromCollect”時,你可以選擇“java.util.Collection”,“java.util.List”或“java.util.Set”事實類型。這個事實類型會被自動包含在事實類型列表中。

?

右邊模式的收集條件元素可以是下面模式之一:

?

n?FactTypePattern(事實類型模式)

n?FreeFormExpression(自由表單表達式)

n?FromPattern(From模式)

n?FromCollectPattern(FromCollect模式)

n?FromAccumulatePattern(FromAccumulate模式)

?

圖2.5來自CollectCE構建器

?

當使用“FromAccumulate”時,左邊模式可以是任何事實類型模式。這個條件元素的右邊部分被劃分成兩個:

?

圖2.6來自累積CE構建器

?

左邊模式可以是任何事實類型模式。這個條件元素的右邊部分被劃分成兩個:

?

源模式:(在載圖中的,Bed$n)可以是任何事實類型、From、Collect或者Accumulate模式

?

累積函數:在這里你可發現一個標簽式面板,你可以輸入一個累積函數(在截圖中的sum()),或者你可以使用“CustomCode”創建一個在線定制函數。

?

2.1.5.14規則模板

?

規則模板可以被指導編輯器用于編輯復雜的規則,然后通過一個電子表格的表格數據隱喻輕松地編寫它。替代了一個字段的值,僅是用名為"TemplateKey"標識它,并且該key可以作為網格中的一個列。每行可以應用規則模板來產生一個規則。

?

圖2.7在'WHEN'部分增加了一個TemplateKey。

?

圖2.8"THEN"部分增加了一個TemplateKey。

?

圖2.9根據這些TemplateKey填充行。

?

圖2.10每行產生一個規則

?

2.1.5.15工作集

?

在建模規則時,用戶暴露所有的事實類型,它可能是整個的很小部分。工作集允許相關的事實類型分組在一起,并在編寫規則時,提供一個更易于管理的選擇事實類型的視圖。

?

圖2.11顯示導入的類型。

?

圖2.12創建一個動物工作集。

?

圖2.13沒有使用工作集,所有類型是可見的。

?

圖2.14選擇動物工作集。

?

圖2.15可用的類型減少了。

2.1.5.16事實約束

工作集可以與事實約束相結合,提供額外的設計時間驗證。例如,如果你依據某個人的年齡編寫一個規則,在設計時,我們可以分辨有效的范圍,并且使用它來約束作者。事實約束是工作集的一部分,并且在編輯一個規則時,你必然選擇工作集約束,那個你希望用于作為驗證處理部分的約束。

?

圖2.16選擇字段。

?

圖2.17選擇字段約束類型.

?

圖2.18一個范圍選擇的例子。

?

圖2.19選擇工作集,用于驗證年齡字段。

?

圖2.205歲是無效的。

?

2.1.5.17指導規則編輯器

?

編輯規則變得更明確。編輯器是更小“盒子”,且用一個普通文本編寫更多規則。增加了"contains"關鍵字,現在在綁定變量給限制是更容易了。

?

2.1.5.17.1模式排序

?

指導編輯器在lhs和rhs部分支持模式重排序,以及位置插入,新的模式可以以任何順序被插入(并不總是在最后)。

?

圖2.21上下移動元素。

?

圖2.22在任何位置插入元素。

?

2.1.5.18決策表(Guvnor)

?

增加了關鍵字"in"。

可以移動列,并且新行的位置可以自由選擇。

?

2.1.6Eclipse

?

2.1.6.3在大綱視圖中分組規則

?

現在你可以為議程組使用排序或分組。

?

圖2.23分組議程組

圖2.24排序議程組

2.1.6.4支持在審計視圖中拖/放文件。

現在可以拖放日志文件到審計視圖中。

2.1.7已知的問題

2.1.7.3多線程模式

使用試驗的多線程執行模式存在一個已知的問題,如下面JIRA中描述的一樣

https://jira.jboss.org/browse/JBRULES-2125

?

2.2????? 在Drools 5.0.0中值得關注的新東西

?

2.2.1??? Drools API

?Drools現在有完善的api/實現分離物,不再面向規則。當我們開始支持其他邏輯形式時,如工作流和事件處理時,這是一個重要的策略。最重要的改變是我們面向知識,而不是面向規則。drools-api模塊提供接口和工廠,并且與以前相比,我們已竭力提供更好的javadocs,帶有一些代碼片段。drools-api還有助于清楚地顯示有意作為一個用戶的api是什么,只是一個引擎的api是什么,而Drools核心和Drools編譯器沒有充分明確這點。你將使用的最普通的接口有:

?

n?org.drools.builder.KnowledgeBuilder

n?org.drools.KnowledgeBase

n?org.drools.agent.KnowledgeAgent

n?org.drools.runtime.StatefulKnowledgeSession

n?org.drools.runtime.StatelessKnowledgeSession

?

工廠類,帶有靜態方法,提供上面接口的實例。一個可插式提供者方法被用來允許提供者實現在運行時連接工廠。你將最常使用的工廠有:

?

n?org.drools.builder.KnowledgeBuilderFactory

n?org.drools.io.ResourceFactory

n?org.drools.KnowledgeBaseFactory

n?org.drools.agent.KnowledgeAgentFactory

?

例子2.20 加載一個規則資源的一個典型例子

?

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

kbuilder.add( ResourceFactory.newUrlResource( url ), ResourceType.DRL );

if ( kbuilder.hasErrors() ) {

? System.err.println( builder.getErrors().toString() );

}????????

?

KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

kbase.addKnowledgePackages( builder.getKnowledgePackages() );

?

StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();

ksession.insert( new Fibonacci( 10 ) );

ksession.fireAllRules();

?

ksession.dispose();

?

一個典型的加載一個流程資源的例子。注意ResourceType使用相應的資源類型被改變。

?

例子 2.21一個典型的加載一個流程資源的例子。注意ResourceType使用相應的資源類型被改變。

?

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

kbuilder.add( ResourceFactory.newUrlResource( url ),

??????????? ResourceType.DRF );

if ( kbuilder.hasErrors() ) {

? System.err.println( builder.getErrors().toString() );

}????????

?

KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

kbase.addKnowledgePackages( builder.getKnowledgePackages() );

?

StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();

ksession.startProcess( "Buy Order Process" );

?

ksession.dispose();

?

'kbuilder','kbase','ksession'是經常使用的變量標識符,用knowledge的k開頭。

?

例子 2.22 我們已統一了決策樹如何加載,現在不再需要利用電子表格編譯器預先生成一致的DRL。

?

DecisionTableConfiguration dtconf = KnowledgeBuilderFactory.newDecisionTableConfiguration();

dtconf.setInputType( DecisionTableInputType.XLS );

dtconf.setWorksheetName( "Tables_2" );

kbuilder.add( ResourceFactory.newUrlResource( "file://IntegrationExampleTest.xls" ),

??????????? ResourceType.DTABLE,

??????????? dtconf );

?

使用配置也可以配置一個KnowledgeBase,通過一個xml更改集,而不是編程方式。

?

例子2.23 一個簡單的更改集例子

?

<change-set?xmlns='http://drools.org/drools-5.0/change-set'
xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'
xs:schemaLocation='http://drools.org/drools-5.0/change-set?change-set-5.0.xsd'?>


??<add>
??????<resource?source='classpath:org/domain/someRules.drl'?type='DRL'?/>
??????<resource?source='classpath:org/domain/aFlow.drf'?type='DRF'?/>
??</add>


</change-set>

?

例子 2.24 可以象其他資源類型一樣添加

?

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

kbuilder.add( ResourceFactory.newUrlResource( url ),

??????????? ResourceType.ChangeSet );

?

KnowledgeAgent與?RuleAgent相比較,其他較大的變化是輪詢掃描現在是一個服務了。進一步說,是在代理通知與資源監視之間有一個抽象,允許使用其他輪詢機制。

?

例子 2.25 這些服務當前不再默認啟動,要啟動它們要如下這樣:

?

ResourceFactory.getResourceChangeNotifierService().start();

ResourceFactory.getResourceChangeScannerService().start();

?

增加了兩個接口,ResourceChangeNotifier和ResourceChangeMonitor。KnowledgeAgent使用ResourceChangeNotifie實現訂購資源更改通知。通過添加ResourceChangeMonitor通知ResourceChangeNotifie資源改變了。我們現在只提供一個開箱既用的的監視器, ResourceChangeScannerService,它輪詢資源的變化。然而,存在有api用于用戶添加自己的監視器,所以可以使用一個如jms這樣的基于推的監視器。

?

ResourceFactory.getResourceChangeNotifierService().addResourceChangeMonitor( myJmsMonitor);

?

2.2.2??? Drools Guvnor

?

n?新外觀的網頁工具

?圖2.25 新外觀

?

n?網頁基于決策表編輯器

圖2.26網頁基于決策表編輯器

?

n?集成的場景測試

?圖2.27 運行所有場景

?

圖2.28 運行單個場景

?

n?WebDAV文件基于接口庫

?

圖2.29? WebDAV

?

n?聲明式模擬類型(不使用pojos的類型)

圖2.30 ?聲明式模擬

?

它與"declare"語句一起工作——你現在可以在drl本身內聲明類型。然后你可以裝配它們,不必使用pojo(如果你喜歡)。然后這些類型可用于規則庫中。

?

u?細粒度安全(鎖定訪問每包或每分類應用程序)。只有分類權限的用戶具有有限的UI能力(針對企業用戶)

u?執行服務器——執行通過XML或JSON訪問規則。

u?分類規則允許你為一個分類設置“父規則”。出現在給定分類的任何規則會“繼承”指定的規則——例如,繼承條件/ LHS。分類的基本規則可以在包配置標簽上設置。RHS不被繼承,只有LHS被繼承。

u?場景運行器檢測無限循環。

u?現在可以設置在指南編輯器中的DSL句子,用于顯示作為一個下接菜單的枚舉、作為一個數據拾取器的數據、作為一個單選框的布爾值,并且使用正則表達式來校驗用戶輸入(在Guvnor中的DSL小飾件)。

u?函數可以使用文本編輯器進行編輯。

u?可以添加對象到全局集合。

u?翻譯為英語,西班牙語,漢語和日語。

2.2.3??Drools Expert

?

2.2.3.1??非對稱Rete算法實現

?

不再需要影子代理。影子代理保護引擎免受有關實事的信息變化的影響,如果發生在引擎控件的外部,它可能不會被修改或撤消。

?

2.2.3.2??包構建器現在可以構建多個命名空間

?

你不再需要對一個包命名空間構建一個PackageBuilder?。只要保持為所有命名空間增加你的DRLs,并且getPackages()為每個使用的命名空間返加一個包數組。

?

例子 2.26 獲得多個包

?

Package[] packages = pkgBuilder.getPackages();

?

2.2.3.3??規則庫連接包構建器

?

現在可以連接一個?RuleBase到一個?PackageBuilder,這意味著規則被構建,并且同時被添加到規則庫。PackageBuilder使用現行的RuleBase的Package實例作為它的資源,取消了發生在現有方法中的Package創造和融合。

?

例子 2.27 連接規則庫(RuleBase)到包構建器(PackageBuilder)

?

RuleBase ruleBase = RuleBaseFactory.newRuleBase();

PackageBuilder pkgBuilder = new PackageBuilder( ruleBase, null );

?

2.2.3.4??有狀態會話的二進制編碼

?

有狀態會話現在可以保存,并可在以后的日期中恢復。預加載數據會話現在可以被創建。對用戶對象的持久化可使用可插式策略,例如,hibernate或特征(identity)映射。

?

2.2.3.5??類型聲明

?

Drools現在支持一種新的基礎結構,稱為類型聲明。這個結構達到兩個目的:能夠聲明實事元數據,以及能夠為規則引擎動態地產生局部的新的事實類型。Guvnor模擬工具在底層使用了它。下面是該結構的一個例子:

?

例子 2.28 聲明StockTick

?

declare StockTick

? @role( event )

? @timestamp( timestampAttr )

?

? companySymbol : String

? stockPrice : double

? timestampAttr : long

end

?

2.2.3.6??聲明實事元數據

?

要聲明和關聯事實的元數據,只需要對你想聲明的每個元數據ID使用@符號。例子:

?

例子 2.29 聲明元數據

?

declare StockTick

? @role( event )

end

?

2.2.3.7??觸發Bean產生

?

要激活動態bean產生,僅為你的類型聲明添加字段和類型。

?

例子 2.30 聲明Person

?

declare Person

? name : String

? age : int

end

?

2.2.3.8??DSL的改進

?

一系列DSL的改進被實現,包括一個完善的新解析器,并且能夠為匹配的變量聲明匹配的掩碼(mask)。例如,它可限定一個電話號碼字段為2位數的國家代碼+ 3位區號+ 8位數字電話號碼,所有連接以“ - ”(破折號)連接,通過象這樣聲明DSL映射:電話號碼為{number:\d{2}-\d{3}-\d{8}},所有有效的Java正則表達式可以用于變量的掩碼中。

?

2.2.3.9??fireUntilHalt()

?

Drools現在支持fireUntilHalt()功能,它以一種被動模式啟動引擎,在那兒規則會被連續引發,直到調用了halt()。這尤其對CEP(complex event processing)場景有用,CEP場景需要俗稱的“活動查詢”。

?

2.2.3.10???規則庫分區和多線程傳播

?

Drools ReteOO算法現在支持一個選項,用于以多線程模式啟動規則庫,在那兒Drools ReteOO網絡被劃分為多個部分,然后規則被多個線程并發計算。對通常有幾個獨立規則并發運行的CEP,它也有一個要求,接近實時性能/吞吐量的要求,并且一個計算不能干擾其他的計算。

?

2.2.3.11???XSD模式支持

?

Drools現在支持XSD模式。記住雖然XSD模式以用于Drools類加載器的本地POJO類生成。在包構建器中存在有一個幫助類用于模式的產生。一旦數據模式被生成,你通常使用JAXB數據加載器插入數據。

?

2.2.3.12???數據加載器

?

Drools現在支持兩種數據加載器,Smooks和JAXB。Smooks是一個用于ETL的開源數據轉換工具,JAXB是一個標準的Sun數據映射工具。單元測試顯示Smooks和JAXB均可在這里找到。

?

2.2.3.13???類型安全配置

?

在Drools中,除了能夠通過配置文件配置選項外,也可用系統屬性配置,通過API的 setProperty()方法設置屬性,Drools-API現在支持類型安全配置。我們不希望為每個可能的配置方法增加特殊的方法,有兩個原因:它污染了API,并且每次都有一個新選項增加到Drools,API將不得不改變。而這種方式,我們遵循模塊化,類基于配置,在此處為每個可能的配置,一個新的選項類增加到了API,除了靈活之外,也維持了API的穩定。所以,現在為了設置配置選項,你只需要使用枚舉或者提供每個選項的工廠。例如,如果你希望為斷言行為"equality"?配置知識庫,并且自動從模式匹配中刪除特征(identities),你只需要使用下面的枚舉:

?

例子2.31 配置

?

KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();

config.setOption( AssertBehaviorOption.EQUALITY );

config.setOption( RemoveIdentitiesOption.YES );

?

對于選項,我們不需要預定義約束,或者可以假設多個值,提供一個工廠方法。例如,配置alpha值為5,只使用get()工廠方法:

?

例子 2.32 配置alpha值

?

config.setOption( AlphaThresholdOption.get(5) );

正如你所見,為每個不同的可能配置,使用了相同的setOption()方法,然而它們仍然是類型安全的。

?

2.2.3.14???新的累積函數:collectSet和collectList

?

有時候,有必要收集來自實事屬性的值的集合或列表,而不是實事本身。在這種情況下,不可能使用collect CE。所以對這種情況,現在Drools有兩個新的累積函數:collectSet用于收集值的集合(即,無重復的值),collectList用于收集值的列表(即,允許重復的值):

?

例子 2.33 新的累積函數

?

# collect the set of unique names in the working memory

$names : Set() from accumulate( Person( $n : name, $s : surname ),

??????????????????????? collectSet( $n + " " + $s ) )

?

# collect the list of alarm codes from the alarms in the working memory

$codes : List() from accumulate( Alarm( $c : code, $s : severity ),

???????????????????????? collectList( $c + $s ) )

?

2.2.3.15??用于類型聲明的新元數據:@propertyChangeSupport

?

事實實現了象定義在Javabean(tm)規范中的屬性改變的支持?,F在可以注釋,讓引擎注冊自身來偵聽事實屬性的變化。在Drools 4 API的insert()方法中使用的布爾參數已過時,并且不存在于drools-aip模塊中了。

?

例子 2.34? @propertyChangeSupport

?

?declare Person

???????? @propertyChangeSupport

end

?

2.2.3.16??批處理器

?

批處理器允許一個知識會話使用命令腳本,此外,無論是StatelessKnowledgeSession?還是?StatefulKnowledgeSession實現都可以使用CommandFactory創建這個接口命令,且使用"execute"?方法執行,如下所示:

?

例子 2.35 使用CommandFactory

?

ksession.execute( CommandFactory.newInsert( person ) );

?

盡管這樣,你通常會希望執行一個批處理命令,通過組合命令?BatchExecution可以完成它。BatchExecutionResults現在用來處理結果,某些命令可以使用"out"標識符,用它來添加結果到BatchExecutionResult。現在可以輕松地執行查詢,并把結果添加到BatchExecutionResult。這個結果進一步被限定到這個執行調用,并且通過BatchExecutionResults返回。

?

例子 2.36 ?使用BatchExecutionResult

?

List<Command> cmds = new ArrayList<Command>();

cmds.add( CommandFactory.newSetGlobal( "list1", new ArrayList(), true ) );

cmds.add( CommandFactory.newInsert( new Person( "jon", 102 ), "person" ) );

cmds.add( CommandFactory.newQuery( "Get People" "getPeople" );

?

BatchExecutionResults results = ksession.execute( CommandFactory.newBatchExecution( cmds ) );

results.getValue( "list1" ); // returns the ArrayList

results.getValue( "person" ); // returns the inserted fact Person

results.getValue( "Get People" );// returns the query as a QueryResults instance.

End

?

CommandFactory詳細描述支持的命令,它們所有都可以使用XStream和BatchExecutionHelper進行編碼??梢允褂霉艿澜M合它們來自動化會話腳本。

?

例子 2.37 使用PipelineFactory

?

Action executeResultHandler = PipelineFactory.newExecuteResultHandler();

Action assignResult = PipelineFactory.newAssignObjectAsResult();

assignResult.setReceiver( executeResultHandler );

Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );

outTransformer.setReceiver( assignResult );

KnowledgeRuntimeCommand batchExecution = PipelineFactory.newBatchExecutor();

batchExecution.setReceiver( outTransformer );

Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );

inTransformer.setReceiver( batchExecution );

Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );

pipeline.setReceiver( inTransformer );

?

對一個規則集使用上面所述的,會更新一個Cheese事實的價格,下面給定的xml會插入一個使用了輸出標識符(out-identifier)的Cheese實例。

?

例子 2.38 更新Cheese實事

?

<batch-execution>

<insert?out-identifier='outStilton'>
??<org.drools.Cheese>
????<type>stilton</type>
????<price>25</price>
????<oldPrice>0</oldPrice>
??</org.drools.Cheese>
</insert>
</batch-execution>

?

然后我們會得到BatchExecutionResults:

?

例子 2.39 更新Cheese實事


<batch-execution-results>
?<result?identifier='outStilton'>
???<org.drools.Cheese>
?????<type>stilton</type>
?????<oldPrice>0</oldPrice>???????
?????<price>30</price>
???</org.drools.Cheese>
?</result>
</batch-execution-results>

?

2.2.3.17??編碼

?

MarshallerFactory被用來編碼和解碼StatefulKnowledgeSessions。最簡單的,它可以象下面這樣使用:

?

例子 2.40 使用MarshallerFactory

?

// ksession is the StatefulKnowledgeSession

// kbase is the KnowledgeBase

ByteArrayOutputStream baos = new ByteArrayOutputStream();

Marshaller marshaller = MarshallerFactory.newMarshaller( kbase );

marshaller.marshall( baos, ksession );

baos.close();

?

然而,在處理引用的用戶數據時,你需要更有彈性地使用編碼。要達成它,我們有一個ObjectMarshallingStrategy接口。我們提供了兩個實現,但是用戶可以自己實現它。提供的兩個是IdentityMarshallingStrategy和SerializeMarshallingStrategy。默認為SerializeMarshallingStrategy,如上例所示,它只在一個用戶實例上調用Serializable或Externalizable方法。而IdentityMarshallingStrategy為每個用戶對象創建了一個整數id,并存儲它們在一個映射中,該id被寫入到該流中。在解碼時,它只簡單地查看IdentityMarshallingStrategy映射,取回該實例。這意味著,如果你使用IdentityMarshallingStrategy,它對編碼實例的生命周期是有狀態的,并且會創建ids,保持它企圖編碼的所有對象的引用。

?

例子 2.41 使用IdentityMarshallingStrategy編碼

?

ByteArrayOutputStream baos = new ByteArrayOutputStream();

Marshaller marshaller = MarshallerFactory.newMarshaller( kbase, new ObjectMarshallingStrategy[] { MarshallerFactory.newIdentityMarshallingStrategy() } );

marshaller.marshall( baos, ksession );

baos.close();

?

為增加彈性,我們不能想當然地認為單策略更合適,所以我們增加了一個ObjectMarshallingStrategyAcceptor?接口,每個ObjectMarshallingStrategy都有。編碼器有一個策略鏈,并且當它企圖讀或寫一個用戶對象時,它遍歷策略,詢問它們是否承擔負責編碼用戶對象。提供了一個實現為ClassFilterAcceptor。它允許使用字符和通匹符匹配類名。默認為"*.*",所以在上面使用的IdentityMarshallingStrategy,它有一個默認的"*.*"接收器。然而,比方說,我們希望序列化所有類,一個給定的包除外,這種情況,我們會使用身份查詢,如下所示:

?

例子 2.42 ?使用身份查詢

?

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ObjectMarshallingStrategyAcceptor identityAceceptor = MarshallerFactory.newClassFilterAcceptor( new String[] { "org.domain.pkg1.*" } );

ObjectMarshallingStrategy identityStratetgy = MarshallerFactory.newIdentityMarshallingStrategy( identityAceceptor );

Marshaller marshaller = MarshallerFactory.newMarshaller( kbase, new ObjectMarshallingStrategy[] { identityStratetgy, MarshallerFactory.newSerializeMarshallingStrategy() } );

marshaller.marshall( baos, ksession );

baos.close();

?

2.2.3.18??知識代理

?

KnowlegeAgent由?KnowlegeAgentFactory創建。KnowlegeAgent提供自動加載、緩存和重新加載資源,并且根據一個屬性文件配置它。當KnowlegeBase使用的資源更改時,KnowlegeAgent可以更新或重構KnowlegeBase。通過給定工廠的配置確定KnowlegeAgent的策略,但通常使用基于標準輪詢的拉策略。我們希望增加基于推的更新,并在將來的版本中重構它。下面的例子,構建了一個代理,它根據在路徑字符串中指定的文件構建了一個新的KnowledgeBase。它會每30秒拉這些文件,而不是更新存在的一個,因為?"newInstance" 設置為了"true"?(然而,目前只支持"true"?值,并且很難編碼到引擎中)。

?

例子 2.43 構建一個代理

?

// Set the interval on the ResourceChangeScannerService if you are to use it and default of 60s is not desirable. ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration(); sconf.setProperty( "drools.resource.scanner.interval", ????????????????? "30" ); // set the disk scanning interval to 30s, default is 60s ResourceFactory.getResourceChangeScannerService().configure( sconf ); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration(); aconf.setProperty( "drools.agent.scanDirectories", ????????????????? "true" ); // we want to scan directories, not just files, turning this on turns on file scanning aconf.setProperty( "drools.agent.newInstance", ????????????????? "true" ); // resource changes results in a new instance of the KnowledgeBase being built, ??????????????????????????? // this cannot currently be set to false for incremental building ?? ? KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent( "test agent", // the name of the agent ??????????????????????????????????????????????????????????????? kbase, // the KnowledgeBase to use, the Agent will also monitor any exist knowledge definitions ??????????????????????????????????????????????????????????????? aconf ); kagent.applyChangeSet( ResourceFactory.newUrlResource( url ) ); // resource to the change-set xml for the resources to add

?

KnowledgeAgents可以使用一個空的 KnowledgeBase或植入的一個。如果提供了一個植入的KnowledgeBase,KnowledgeAgent會遍歷KnowledgeBase,并訂閱它發現的資源。雖然KnowledgeBuilder可以構建在一個目錄中發現的所有資源,但信息會被KnowledgeBuilder丟棄,因些那些目錄不會繼續被掃描。只有作為applyChangeSet(Resource)方法的一部分指定的目錄才會被監控。

總結

以上是生活随笔為你收集整理的Drools 5.1.1(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

丁香激情五月婷婷 | 99中文在线 | 久久国产精品成人免费浪潮 | 成人av片免费观看app下载 | 视频国产在线 | 亚洲成av人片一区二区梦乃 | 中文字幕乱偷在线 | 综合黄色网 | 日韩91av| 日韩av中文字幕在线 | 亚洲精品福利视频 | 久久国产免费视频 | 欧美国产亚洲精品久久久8v | 一本色道久久精品 | 香蕉在线观看视频 | 草久视频在线观看 | 精品在线免费视频 | 久草免费资源 | 毛片精品免费在线观看 | 欧美aⅴ在线观看 | 中国一级特黄毛片大片久久 | 国产精品男女 | 婷婷综合成人 | 天天干com | 91视频在线免费看 | 国产精品嫩草影院9 | 91欧美国产 | 亚洲欧美成人 | 91精品入口 | 最近中文字幕国语免费av | 精品黄色在线观看 | 欧美精品久久久久久 | 国内成人综合 | 一本到视频在线观看 | 午夜美女av | 亚洲精品自在在线观看 | 国产高清专区 | 99热九九这里只有精品10 | 国产精品午夜在线 | 在线天堂中文www视软件 | 国产成人三级三级三级97 | 伊人久久精品久久亚洲一区 | 欧美国产亚洲精品久久久8v | 丁香六月欧美 | 欧美日韩国产精品一区二区三区 | 亚洲在线激情 | 在线观看香蕉视频 | 国产精品9999久久久久仙踪林 | 日韩精品视频在线免费观看 | 亚洲视屏在线播放 | 美女黄频视频大全 | 最近日韩中文字幕中文 | 91精品一区二区三区久久久久久 | av一区二区三区在线 | 久久久久久久久亚洲精品 | 天天干com | 日韩精品中文字幕在线播放 | 欧美少妇bbwhd | 久久亚洲欧美日韩精品专区 | 中文字幕在线视频免费播放 | 免费看的黄色录像 | 国产伦精品一区二区三区照片91 | 在线免费高清 | 97视频人人免费看 | 国产麻豆精品免费视频 | 亚洲免费视频观看 | av高清影院 | 欧美韩日视频 | 亚洲成人二区 | 国产精品久久久久高潮 | 五月婷av| 日本系列中文字幕 | 国产主播大尺度精品福利免费 | 成人黄在线观看 | 久久精品99国产精品亚洲最刺激 | 激情欧美丁香 | 玖玖精品在线 | 亚洲影院天堂 | 色综合婷婷久久 | 黄色app网站在线观看 | 免费特级黄色片 | 久久久久久久久久久久亚洲 | 91精品综合在线观看 | 99久久精品免费一区 | 永久免费毛片 | 亚洲国产成人精品在线观看 | www.五月天婷婷.com | 久久精品xxx | 一级黄毛片 | 国产视频观看 | 久久国产精品一区二区三区四区 | 久久精品久久99精品久久 | 国产精品久久99综合免费观看尤物 | 黄色在线观看www | 射射色| 久久99国产精品久久 | 激情视频亚洲 | 成人va视频 | 在线观看免费视频 | 国产精品不卡一区 | 久久久久国产精品免费免费搜索 | 国产麻豆剧传媒免费观看 | 国产精品久久久久久久久久久久午夜 | 欧洲亚洲国产视频 | 欧美日韩精品免费观看视频 | 一区二区三区在线观看免费 | 操操操综合 | 亚洲专区 国产精品 | 精品播放 | 国产精品久久久久久久久免费看 | 午夜久久成人 | 亚州国产视频 | 粉嫩av一区二区三区四区 | 97精品国产91久久久久久久 | 日韩一区二区三区免费视频 | 免费看亚洲毛片 | 日韩激情小视频 | 免费av成人在线 | www.日日日.com | 综合婷婷丁香 | 91精品伦理 | 奇米影视四色8888 | 天天爽天天射 | 国产视频欧美视频 | 国产视频一区二区三区在线 | 黄色av网站在线观看免费 | 精品国产一区二区三区久久久蜜臀 | 国产精品成人a免费观看 | 天天噜天天色 | 日韩黄视频 | 在线欧美日韩 | 超碰在线亚洲 | 国产在线污 | 色婷婷综合久久久中文字幕 | 特级a毛片| 中文字幕欲求不满 | 国产在线视频一区二区 | 2018亚洲男人天堂 | 九九久久影视 | 蜜桃av观看| 国产精品麻豆欧美日韩ww | 1024手机基地在线观看 | 久久9999久久 | 精品99免费 | 天堂网一区二区三区 | 国产精品麻豆91 | av短片在线 | 久久久精品网站 | 亚洲综合一区二区精品导航 | 久久久精品网站 | 日韩视频在线观看视频 | 91麻豆国产福利在线观看 | 久久精品99精品国产香蕉 | 欧美精彩视频在线观看 | 日韩在线视频国产 | 中文字幕第一页在线播放 | 国产二区视频在线观看 | 色中色亚洲 | 欧美在线视频免费 | 日韩黄色一级电影 | 狠狠干2018| 日日夜夜噜 | 日韩欧美一区二区三区视频 | 久久久综合香蕉尹人综合网 | 麻豆网站免费观看 | 国产福利网站 | 91久久偷偷做嫩草影院 | 亚洲成人资源在线 | 天天色影院 | 欧美国产大片 | 99re国产视频| 激情视频免费在线观看 | 99爱视频在线观看 | 久久永久免费视频 | 99视频在线免费看 | 久久66热这里只有精品 | 国产区网址 | 操天天操| 亚洲精品动漫在线 | 96av麻豆蜜桃一区二区 | 国产黄色精品在线观看 | av三区在线 | 国产第页 | 天天爽天天做 | 久久久久伦理电影 | 国产精品一区二区免费在线观看 | 天天综合网入口 | 亚洲综合最新在线 | 日韩一区二区三区免费电影 | 婷婷天天色 | 91av在线不卡 | 日韩理论在线观看 | 亚洲精品在线免费看 | 在线色亚洲 | 超级av在线 | 日本中文字幕在线电影 | 五月天国产 | v片在线播放 | 天堂在线一区二区 | 国产二区av | 成人动态视频 | 一级黄色大片在线观看 | 一区二区精品在线 | 成人动漫精品一区二区 | 玖玖爱免费视频 | 国产黄色片在线 | 精品国产乱码一区二 | 国产精品激情在线观看 | 国产精品一区二区在线播放 | 国产亲近乱来精品 | 97免费公开视频 | 久久综合桃花 | 成人国产精品电影 | 超级碰碰碰免费视频 | 黄色软件网站在线观看 | 免费在线一区二区 | 夜色在线资源 | 精品欧美在线视频 | 色噜噜日韩精品一区二区三区视频 | 高清视频一区 | 精品视频中文字幕 | zzijzzij日本成熟少妇 | 超碰97公开 | 久久综合色婷婷 | 免费视频一区 | 久久99热国产 | 国产尤物在线视频 | 日韩激情影院 | 免费a级黄色毛片 | 欧美一级免费片 | 色综合久久久久久中文网 | 亚洲视频1 | 国产免费区 | 欧美精品xx | 97在线观看视频免费 | 久久久国产精品成人免费 | 午夜精品久久久 | 国模吧一区 | 粉嫩av一区二区三区入口 | 欧美一区二区精美视频 | 成人免费视频播放 | 精品视频亚洲 | 一区二区三区四区五区在线视频 | 久久综合婷婷国产二区高清 | 欧美一区,二区 | 九九综合九九 | 日韩和的一区二在线 | 欧美日韩中文另类 | 婷婷亚洲最大 | 在线看片中文字幕 | 天天爱天天操天天干 | 在线观看av中文字幕 | 狠狠狠狠狠狠天天爱 | 婷婷五天天在线视频 | av中文字幕在线电影 | 国产成人精品一区二区 | 日韩激情片在线观看 | 国产xxxxx在线观看 | 91人人爱| 国产精品正在播放 | 亚洲另类xxxx| 国产高清在线免费观看 | 久久久 精品| 国产日韩精品视频 | 日本中文字幕电影在线免费观看 | 在线精品亚洲一区二区 | www.com.黄 | a视频免费看| 开心激情五月网 | 天天草综合 | 又黄又爽又色无遮挡免费 | 在线免费三级 | 欧美美女视频在线观看 | 超碰av在线播放 | 午夜视频二区 | 日韩网页 | 久久精品电影网 | 国产无遮挡又黄又爽在线观看 | 国产 精品 资源 | 日韩av福利在线 | 国产精品一区二区三区观看 | 97视频在线观看网址 | 中文字幕欧美日韩va免费视频 | 久久国产精品区 | 黄色国产在线 | 精品黄色在线观看 | 天天干夜夜夜 | 国产美女久久久 | 久久人人爽爽人人爽人人片av | 免费看毛片网站 | 免费看三级 | ww视频在线观看 | 国产不卡在线视频 | 日韩中文字幕亚洲一区二区va在线 | 国产精品久久久久久久久久三级 | 视频在线观看91 | 国产精品精品久久久久久 | 在线观看完整版 | 国产精品18久久久久久久久久久久 | 91精品国产九九九久久久亚洲 | 黄av资源 | 久久av免费观看 | 中文字幕在线视频国产 | 美女免费电影 | 亚洲成 人精品 | 99久久婷婷| 超碰在线人人草 | 久久免费精品国产 | 精品 一区 在线 | 91av视频观看 | 人人舔人人插 | 高清av影院| 在线看片a| 日本久久久久久 | 夜又临在线观看 | 视频99爱 | 免费人做人爱www的视 | 久久视频在线观看免费 | 成人国产网站 | 欧美一区二区三区在线播放 | 人人射人人插 | 玖玖在线视频观看 | 成人av在线播放网站 | 五月婷婷视频 | 国产91免费观看 | 成人国产精品久久久春色 | a v在线视频| 欧美另类交人妖 | 狠狠狠狠狠色综合 | 在线观看免费一级片 | 有码中文字幕 | www激情久久 | 欧美男女爱爱视频 | 国产色黄网站 | 六月激情 | 91九色免费视频 | 成人久久久久久久久 | 成年人网站免费观看 | 97在线看 | 亚洲黄色激情小说 | 91久久国产综合精品女同国语 | 美女视频是黄的免费观看 | 在线观看日韩av | 99久国产 | av在线不卡观看 | 黄色的片子 | 91探花国产综合在线精品 | 亚洲视频综合在线 | 成年人在线看视频 | 九九九九精品九九九九 | 中文字幕在线看视频 | 国产视频亚洲视频 | 激情五月婷婷网 | 韩国一区二区三区视频 | 深夜免费福利网站 | 亚洲久在线 | 国产精品久久久久久五月尺 | 久草av在线播放 | 久久综合99 | 黄色亚洲片 | 午夜婷婷在线播放 | 九九视频网站 | 精品国产免费久久 | 天天添夜夜操 | 亚洲美女精品区人人人人 | 国产一级三级 | 婷婷5月色 | 亚洲精品456在线播放第一页 | 99在线免费观看视频 | 欧美孕交vivoestv另类 | 欧美成人精品欧美一级乱黄 | av电影在线不卡 | 婷婷色综合网 | 96视频在线 | 黄色免费电影网站 | 99视频在线观看视频 | 97精品久久人人爽人人爽 | 精品一二三四在线 | 欧美精品久久人人躁人人爽 | 玖玖综合网 | 日韩欧美一区二区三区黑寡妇 | 一区二区三区免费网站 | 视频一区视频二区在线观看 | 狠狠色噜噜狠狠狠狠2021天天 | 狠狠色免费| 久久国产一区二区 | 久久欧洲视频 | 夜夜操狠狠操 | 免费看黄视频 | 欧美激情另类 | av一级免费 | 国产精品久久久久久久久久久免费看 | 国内精品久久影院 | 亚洲一区久久久 | 国产中文字幕91 | 久久综合狠狠综合 | 亚洲va综合va国产va中文 | 天天操天天怕 | www.日日日.com | 精品久久久久久国产偷窥 | 成人免费在线看片 | 麻豆免费在线视频 | 麻豆视频免费版 | 婷婷av综合| 亚洲在线精品视频 | 操操操人人 | 婷婷深爱五月 | 超碰av在线 | 国产精品一区二区三区久久 | 三级黄色大片在线观看 | 成人99免费视频 | 日韩深夜在线观看 | 久草视频在线资源站 | 成人午夜网 | 久久国产精品偷 | 日韩理论电影在线观看 | 国产又粗又猛又爽 | 婷婷色资源| 天天舔天天射天天操 | 东方av在线免费观看 | 国产成人精品久久亚洲高清不卡 | 中文字幕av在线播放 | 夜色资源站wwwcom | 精品国精品自拍自在线 | 婷婷网在线| 人人爽人人爽人人爽人人爽 | 精品 激情 | 91九色精品| 开心色激情网 | 国产99色 | 在线免费色| 色综合网在线 | 欧美aa一级片 | 7777xxxx| 亚洲人视频在线 | 日韩理论 | 久久无码av一区二区三区电影网 | 成人小视频免费在线观看 | 97在线看| 成人综合免费 | 久久精品国产免费看久久精品 | 国产原创av片 | 人人爽久久涩噜噜噜网站 | 超碰97免费在线 | 349k.cc看片app | 久久一级片 | 国产精品黄色影片导航在线观看 | 7777精品伊人久久久大香线蕉 | 天天插综合 | 亚洲尺码电影av久久 | 国产精品2019 | 美女一区网站 | 国产精品淫片 | 摸bbb搡bbb搡bbbb| 亚洲九九九在线观看 | 国产精品久久三 | 亚洲精品在线观看免费 | 亚洲精品久久久久中文字幕m男 | 欧美日韩精品在线视频 | 亚洲一级免费电影 | 五月天精品视频 | 欧美久久电影 | 国产精品亚洲人在线观看 | 4438全国亚洲精品在线观看视频 | 国产免码va在线观看免费 | 日韩精品高清视频 | www.综合网.com | 日韩免费观看高清 | 国产亚洲精品日韩在线tv黄 | 日韩精品一二三 | 欧美性黄网官网 | 天天综合日日夜夜 | 日韩大片在线免费观看 | 国产精品亚洲综合久久 | 99久久综合精品五月天 | 国内外成人免费在线视频 | 日本性xxxxx| 欧美日韩不卡在线 | 国产免费观看高清完整版 | 91大片成人网 | 日韩免费福利 | 免费在线观看一区 | 久草在线中文视频 | 中文字幕久久亚洲 | 午夜精品婷婷 | 久久久久亚洲精品成人网小说 | 黄色av电影免费观看 | av中文资源在线 | 国产视频高清 | 精品久久网站 | 国产尤物在线视频 | 亚洲精品色婷婷 | 日本aaa在线观看 | 国产 字幕 制服 中文 在线 | 国产一级视频在线 | 日本三级全黄少妇三2023 | 成人黄在线观看 | 天堂视频一区 | 国产精品99久久久久久武松影视 | 国产精品黄色av | 国产黄色在线看 | 国产一区二区三区高清播放 | 色诱亚洲精品久久久久久 | 成年人视频在线 | 国产精品久久9 | 色.com| 色久五月| 久久久久夜色 | 国语对白少妇爽91 | 久久无码精品一区二区三区 | 91麻豆精品国产91久久久久 | 国产传媒中文字幕 | 毛片网在线播放 | 五月天婷亚洲天综合网鲁鲁鲁 | 日日夜夜综合 | 黄色av影院| 99热这里有 | 九九日韩 | 中文在线免费一区三区 | 激情综合站 | 狠狠操91 | 成人国产精品免费 | 成人av免费在线播放 | 久久精品视频中文字幕 | 人人舔人人插 | 日韩精品首页 | 中文成人字幕 | 开心丁香婷婷深爱五月 | 热久久在线视频 | 国产精品成人久久 | 麻豆va一区二区三区久久浪 | 四虎在线免费观看 | 99草视频在线观看 | wwxxxx日本| 亚洲a免费| 国内丰满少妇猛烈精品播放 | 最新中文在线视频 | 日韩精品2区 | 久久激情视频 久久 | 在线观看亚洲成人 | 久久人人爽人人爽人人片 | 久草在线观 | 亚洲最大成人免费网站 | 久久久影院一区二区三区 | 超碰97中文 | 人人草在线视频 | 国产精品免费观看在线 | 天天爽天天射 | 久久伊99综合婷婷久久伊 | 国产精品va在线 | 日韩城人在线 | 操操操影院 | 免费观看的黄色 | 欧美精品久久久久久久久免 | 99久久久久免费精品国产 | 97小视频| 在线之家免费在线观看电影 | 天天人人综合 | 久久99精品久久久久久 | 精品xxx | 欧美乱码精品一区 | 高清国产午夜精品久久久久久 | 91av在| 欧美日韩视频在线观看一区二区 | 丁香五月缴情综合网 | 久草在线资源视频 | 激情久久综合网 | 性色av免费观看 | 超碰人人草 | 中文字幕国产精品 | 国产中文字幕一区 | 久草在线费播放视频 | 久久综合综合久久综合 | 日韩一区精品 | 国产精品18久久久久久首页狼 | 99视频精品全部免费 在线 | 国产主播大尺度精品福利免费 | 香蕉网在线观看 | av怡红院 | 欧美福利在线播放 | av成人免费网站 | 综合网在线视频 | 81精品国产乱码久久久久久 | 91最新视频在线观看 | 中文av字幕在线观看 | 在线观看理论 | 97成人在线视频 | 国产99久久久国产精品免费二区 | 美女国产在线 | 精品久久久久久亚洲综合网站 | 99免费在线视频 | 国产福利在线不卡 | 在线成人观看 | 十八岁以下禁止观看的1000个网站 | 免费黄色激情视频 | 99亚洲精品视频 | 久久久久久毛片精品免费不卡 | 日韩精品在线看 | 久久久在线观看 | 中文字幕在线第一页 | 欧美另类美少妇69xxxx | 五月天激情综合 | 伊人中文在线 | 日韩美女免费线视频 | 国产h在线观看 | 美女免费黄视频网站 | 亚洲成人蜜桃 | 久草视频免费在线观看 | 欧美另类高清 videos | 国产一卡二卡四卡国 | 91九色在线视频 | 最近日本韩国中文字幕 | 久久只精品99品免费久23小说 | 久久97久久 | 永久av免费在线观看 | 手机看片中文字幕 | 久久久久美女 | 亚洲一区二区三区毛片 | 亚洲一区尤物 | 99精品视频在线观看视频 | 日韩专区av| 正在播放亚洲精品 | 欧美日韩国产免费视频 | 日本动漫做毛片一区二区 | av网站在线观看免费 | 黄色三级免费观看 | 免费一级片久久 | 激情伊人五月天 | 成人免费电影 | 国产区在线看 | 精品视频亚洲 | 福利一区视频 | 免费在线黄网 | 成人中文字幕av | 国产a级片免费观看 | 激情一区二区三区欧美 | 在线黄色毛片 | 天天做日日爱夜夜爽 | 午夜精品电影一区二区在线 | 成人免费在线播放视频 | 色婷五月天 | 日本特黄一级片 | 男女免费视频观看 | 久草在线手机视频 | 亚洲精品国产精品国自产 | 欧美日韩激情视频8区 | 久久久国产精品成人免费 | 五月天中文在线 | 日日日操操 | 日本bbbb摸bbbb | 中文字幕刺激在线 | 国产福利一区二区在线 | 国产又粗又猛又黄 | 国产精品亚州 | 91免费版在线观看 | 深爱激情站| 99热这里 | 91精彩在线视频 | 国产美女精品人人做人人爽 | 国产福利a| 蜜桃视频精品 | 国内视频1区| 国产免费av一区二区三区 | 欧美一级黄色视屏 | 99精品免费久久久久久久久日本 | 国产美女在线免费观看 | 五月天网页| 黄色小说18 | 亚洲精欧美一区二区精品 | 天天操天天干天天插 | 欧美日韩激情网 | 国产精品麻豆一区二区三区 | 久久99视频免费观看 | 国产日产精品一区二区三区四区 | 麻豆视频91 | 亚洲狠狠丁香婷婷综合久久久 | 亚洲激精日韩激精欧美精品 | 欧洲精品二区 | 青青色影院 | 久久国产麻豆 | 制服丝袜一区二区 | 香蕉网站在线观看 | 日本精品视频网站 | 九色精品免费永久在线 | aa级黄色大片 | 99这里只有 | 新版资源中文在线观看 | 欧美日韩在线观看一区二区三区 | av免费福利 | 欧美日本啪啪无遮挡网站 | 视频91| 在线精品观看 | 97人人模人人爽人人喊网 | av在线8 | 91完整版观看 | 国产护士hd高朝护士1 | 日韩精品中文字幕一区二区 | 国产清纯在线 | 国产黄在线 | 欧美在线视频一区二区三区 | 国产成人精品一区二区三区 | 日日爱影视 | 国产区在线| 精品欧美一区二区三区久久久 | 精品产品国产在线不卡 | 色全色在线资源网 | 成人免费观看在线视频 | 欧美资源 | 久久99国产精品久久99 | 91色九色| 天天视频色| 亚洲精品美女免费 | 一区二区三区福利 | 亚洲天天综合网 | 亚洲国产中文字幕在线观看 | 色91在线视频 | 色综合天天 | 欧美乱码精品一区二区 | 97成人在线观看 | 国产成人精品三级 | 欧美韩日视频 | 97电影院网 | 国产精品欧美精品 | 97在线观看视频免费 | 国产伦理久久精品久久久久_ | 91试看 | 日韩av片无码一区二区不卡电影 | 天天摸日日摸人人看 | 久久66热这里只有精品 | 亚洲最新av在线网址 | 成人黄色免费在线观看 | 99综合影院在线 | 精品久久一区二区 | 国产精品免费久久久久影院仙踪林 | 黄色com| 碰超在线 | 日韩videos高潮hd | 99色国产| 久久综合久久综合久久 | 视频成人| 97在线视频免费观看 | www.狠狠操 | 久草视频首页 | 久久久久久国产精品 | 亚州日韩中文字幕 | 午夜婷婷综合 | 久久国产精彩视频 | 黄色小说视频在线 | 能在线看的av | 精品日本视频 | 中文字幕在线观看视频网站 | 久久精品国产免费观看 | 国产日韩欧美综合在线 | 中文一区二区三区在线观看 | 国产最新网站 | 日本精品中文字幕在线观看 | 午夜免费在线观看 | 欧美久久久久久 | 亚洲国产欧洲综合997久久, | 在线观看电影av | 91九色蝌蚪国产 | 中文字幕在线观看网址 | 中文字幕在线视频国产 | 亚洲精品中文字幕视频 | 亚洲色图av | 国产在线p| 五月激情综合婷婷 | 97网站| 中文亚洲欧美日韩 | 免费观看www小视频的软件 | 久久国产精品系列 | 亚洲精品黄色在线观看 | 欧美日韩午夜 | 久久国产女人 | 成年人网站免费在线观看 | 国产不卡一 | 999久久精品| 国产资源av | 国产精品麻豆三级一区视频 | 国产伦精品一区二区三区在线 | 亚洲国产中文字幕在线观看 | 天堂网一区二区三区 | 中文字幕 国产视频 | 日韩试看| 精品国产伦一区二区三区观看体验 | 97视频免费在线 | 丁香六月婷婷开心婷婷网 | 97人人超碰在线 | 欧美日韩一区二区三区免费视频 | 综合久久久久 | 欧美一级性视频 | 免费观看全黄做爰大片国产 | 国产精品久久久久久吹潮天美传媒 | 久久免费视频3 | 黄色影院在线免费观看 | h动漫中文字幕 | 国产精品久久久久久久久久东京 | 欧美少妇xxxxxx | 91桃色视频 | 91成人午夜 | 色多多视频在线观看 | 日日爱999| 四虎影视成人永久免费观看视频 | 在线色网站 | 亚洲精品乱码久久久久久高潮 | 免费视频国产 | 最近中文字幕高清字幕在线视频 | 91在线视频免费91 | 久久精品国产精品亚洲 | 很污的网站 | 亚洲涩涩网 | 开心色插 | 婷婷色五 | 69国产成人综合久久精品欧美 | 天天插狠狠干 | 午夜视频在线网站 | 日韩资源在线 | 一级做a视频 | 婷婷色社区 | 日本黄色特级片 | 国产中文字幕大全 | 国产精品h在线观看 | 久久精品视频网站 | 深爱综合网 | 天天玩天天干天天操 | 人人插人人插 | 天天搞天天干天天色 | 久久国产精品二国产精品中国洋人 | www毛片com| 99久热在线精品 | 成人午夜黄色影院 | 韩日精品在线观看 | 一区二区三区在线观看免费视频 | 午夜精品一区二区三区在线视频 | 午夜精品一区二区三区在线观看 | 一二区精品| 少妇bbbb搡bbbb搡bbbb | 免费成人短视频 | 九九久久久久99精品 | 日韩一二区在线 | 日韩网站在线看片你懂的 | 超碰97免费观看 | 欧美在线久久 | 国产精品毛片久久久久久久 | 久久久久久久国产精品影院 | 欧美a性| 国内精品久久久久久 | 亚洲国产精品成人女人久久 | 国产色婷婷精品综合在线手机播放 | 亚洲欧洲日韩在线观看 | 天天插天天操天天干 | 美女久久久久 | 国产成人av电影在线 | 中文字幕在线观看三区 | 久久国产一区二区 | 成人免费毛片aaaaaa片 | 国产成人精品免高潮在线观看 | 91一区一区三区 | 91av视屏| 国产亚洲视频中文字幕视频 | 视频在线观看入口黄最新永久免费国产 | 天天操操操操操 | 99一区二区三区 | 亚洲三级影院 | 久久精品一区二区三区中文字幕 | 最新99热 | 激情导航| 绯色av一区 | 深爱激情亚洲 | 日韩av区| 97在线观看免费高清完整版在线观看 | 日韩理论片 | 国产精品区在线观看 | 美女视频黄网站 | 狠狠躁日日躁夜夜躁av | 中文av不卡 | 成人a在线观看 | 欧美特一级| 日韩av区 | 日本黄色免费在线 | 亚洲男人天堂2018 | 欧美亚洲国产精品久久高清浪潮 | 婷婷色综合 | 伊人视频 | 成人毛片一区 | 国产成人精品午夜在线播放 | 免费观看午夜视频 | 日韩免费三区 | 亚洲资源片| 97在线视频免费 | 91麻豆传媒| 91视频在线自拍 | 热久久最新地址 | 一区二区三区精品在线视频 | 国产97碰免费视频 | 国产人成在线观看 | 欧美成人va | 国产在线观 | 日本中文字幕高清 | 免费观看午夜视频 | 日韩精品一区二区三区电影 | 色综久久 | 国产亚洲精品久久久久久大师 | 成人中文字幕在线 | 免费中文字幕视频 | 久草在线一免费新视频 | 国产黄色片一级 | 婷婷色视频 | 五月婷婷,六月丁香 | 黄色av网站在线观看免费 | 中文字幕久久精品一区 | 久久艹久久 | 一本—道久久a久久精品蜜桃 | 九九九视频精品 | 久久97精品 | 国产一区二区三区高清播放 | 久久久久免费精品国产小说色大师 | 久久视频在线免费观看 | 久久精品香蕉视频 | 中文亚洲欧美日韩 | 麻豆国产电影 | 国产99黄| 香蕉网在线观看 | 日韩大陆欧美高清视频区 | 久久人人爽人人人人片 | 亚洲va欧美va人人爽 | 国产色婷婷 | 中文字幕乱码在线播放 | 最近免费中文字幕mv在线视频3 | 日本精品中文字幕在线观看 | 69国产盗摄一区二区三区五区 | 免费看黄网站在线 | 丰满少妇在线观看网站 | av中文字幕不卡 | 国产999视频在线观看 | 久久国产精品色婷婷 | 国产一级片一区二区三区 | 久久久96 | 色综久久 | 国色天香在线 | 日韩av手机在线观看 | 在线激情网 | 亚洲香蕉视频 | 在线播放 一区 | 999久久| 欧美日本一区 | 麻花豆传媒mv在线观看 | 97视频免费观看2区 亚洲视屏 | 中文视频在线看 | 韩国av永久免费 | 国内精品亚洲 | 日韩欧美视频在线免费观看 | 超碰人人乐 | 国产99久久久国产精品 | 在线www色 | 天堂在线免费视频 | 国产黄大片 | 色大片免费看 | 4438全国亚洲精品在线观看视频 | 日本在线成人 | 日韩欧美精品在线 | 国产一卡久久电影永久 | www色| 99久久精品午夜一区二区小说 | 91在线观看欧美日韩 | 国产一区二区在线播放 | 中文字幕第一页在线 | 夜夜躁天天躁很躁波 | 免费v片 | 狠狠狠狠狠操 | 久草在线手机视频 | 91视频a| 中文字幕在线免费看线人 | 狠狠干狠狠色 | 97国产大学生情侣酒店的特点 | 91香蕉国产在线观看软件 | 欧美一级视频免费看 | 国产精品成人免费一区久久羞羞 | 日韩免费成人 | 91欧美视频网站 | 91pony九色丨交换 | 天天干天天干天天干天天干天天干天天干 | 国产99久久久久久免费看 | 国产a精品 | 亚洲最新av在线 | 日韩高清激情 | 五月婷婷国产 | 观看免费av | 五月天婷婷视频 | 中文字幕一二三区 | 久久精品一区八戒影视 | 特黄一级毛片 | 97在线免费 | 久草免费在线视频 | 精品在线视频一区二区三区 | 成人性生爱a∨ | 久久国产精品视频 | 在线不卡中文字幕播放 |