2010-12-08 50 views
9

當前,我將所有規則文件存儲在文件系統上(存在大量版本),並在啓動時將它們的不同版本加載到內存中。我想改變存儲我的drools文件在數據庫中,並想知道是否有任何解決方案或插件Drools這方便或我應該製作自己的?Drools:將規則存儲在數據庫中

謝謝。

回答

3

那麼,你可能想看看Guvnor作爲提供規則管理的一種方式。

但總之,不,你必須自己寫。

請記住,您不需要在文件之間,你可以閱讀規則的字符串表示出來的分貝,只是編譯。

1

我也面臨同樣的情況。 我將所有規則文件存儲在數據庫中。

當裝載在應用程序啓動的規則,我從數據庫中的規則,並將它們存儲在臨時文件夾編制並把它們在規則庫。

如果您的規則在運行應用程序期間發生更改,請使用相同的方式更新規則庫中已更改的規則。

6

是的,它可以做到。所有你需要的是獲得InputStream的能力。在我的情況下,我使用自己的JPA類RulePackage將規則源保存爲byte [],但是可以使用直接JDBC連接來訪問數據庫模式中的BLOB/CLOB字段。重要的是要節省也是類型的存儲的規則源,它會建立規則包時,需要:

switch(rulePackage.getRuleSourceType()) { 
    case DRL: 
    kbuilder.add(ResourceFactory.newByteArrayResource(rulePackage.getSource()), ResourceType.DRL); 
    break; 
    case EXCEL: 
    kbuilder.add(ResourceFactory.newByteArrayResource(rulePackage.getSource()), ResourceType.DTABLE, excelConfig); 
    break; 
    case CSV: 
    kbuilder.add(ResourceFactory.newByteArrayResource(rulePackage.getSource()), ResourceType.DTABLE, csvConfig); 
    break; 
    default: 
    throw new Exception("Rule package '" + rulePackage.getName() + "' has unknown type"); 
} 

你可以考慮使用newInputStreamResource方法,如果更適合你的情況:

case DRL: 
    kbuilder.add(ResourceFactory.newInputStreamResource(new StringInputStream(myDrlAsString)), ResourceType.DRL); 
    break; 

case DRL: 
    kbuilder.add(ResourceFactory.newInputStreamResource(new ByteArrayInputStream(myDrlAsByteArr)), ResourceType.DRL); 
    break; 

類似的東西。

4

是的,你可以通過創建規則包(.pkg文件)來完成。這是文本規則的編譯/二進制形式。

在創建knowledgeBuilder你可以指定包的文件的名稱,也是規則的頻率應更新(比如30秒)。

使用Guvnor將文本規則轉換爲.pkg文件。將該文件保存在應用程序可以訪問它的文件夾中。

如果您需要代碼示例請回復。

0

一旦您開始在數據存儲中存儲多個規則版本的業務,您確實在尋找Guvnor(在Drools 5.x中)或Drools-WB/KIE-Business的業務規則管理(BRMS) WB工作臺在Drools 6.0中。

這些解決方案已經解決了版本控制,存儲和多個規則版本的開箱即用的部署。總之,它們將比本土解決方案更強大。