2014-03-05 55 views
2

直到現在我還無法找出將規則添加到Drools 6.0.0中正在運行的KieSession中的最佳方式(意思是開銷很小),並仍將我的事實保留在KieSession中。在Drools 5中,KSession在KBase更改時進行了更新,但對於Drools 6來說,似乎並非如此,因爲我的規則不是在KieBase中創建的。有沒有辦法做到這一點,而無需更換KieFileSystem中的整個KieModules或Jars。我認爲應該有一個簡單的方法。Drools 6:將規則添加到正在運行的KieSession

你們有想法嗎?

問候

回答

10

是,用例被支持,但要明白,Drools的6引入版本部署的工件(在Maven化kjars)的概念是重要的。換句話說,一旦你用版本X創建了一個kjar,它應該是不可變的。如果您想要將規則添加到/刪除在kjar中定義的庫,則應該創建另一個kjar版本X + 1。這個kjar可以作爲真正的jar或內存在物理上創建在磁盤中。

對於理解kjar是不可變源代碼的概念同樣重要,kcontainer是實例化kjar並允許使用它的kbases和ksessions的容器。

如果理解了這一點,那麼您只需要爲X版本實例化容器,並且當您要更改kbase時,請調用容器updateToVersion(...)方法將其更新爲新版本。 KBases和KSessions的增量更新和保存像他們在Drools的5

單元測試在這裏:https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/test/java/org/drools/compiler/integrationtests/IncrementalCompilationTest.java#L158

代碼片段:

// work with version 1.0.0 
    ReleaseId releaseId1 = ks.newReleaseId("org.kie", "test-upgrade", "1.0.0"); 
    ... 

    // Create a session and fire rules 
    KieContainer kc = ks.newKieContainer(releaseId1); 
    KieSession ksession = kc.newKieSession(); 
    ksession.insert(new Message("Hello World")); 
    ... 

    // upgrade to version 1.1.0 
    ReleaseId releaseId2 = ks.newReleaseId("org.kie", "test-upgrade", "1.1.0"); 
    kc.updateToVersion(releaseId2); 

    // continue working with the session 
    ksession.insert(new Message("Hello World")); 
    ... 
+0

我可以將它連接到從Java代碼的工作臺。不管怎樣,即使事實匹配,規則也不會被解僱。請建議。 – Kumar

+0

@埃德森感謝您的解釋。一個後續問題似乎是爲了更新我們需要保留的對舊KieContainer kc對象的引用的版本。這真的有必要嗎?說一個應用程序重新啓動時,我沒有對舊的KC對象的引用,我如何獲得指向舊版本ID的現有KieContainer對象的引用? – Yatin