2012-11-27 101 views
1

我想知道如何在規則的LHS中使用集合(在contains,memberof中使用),它可以在Guvnor中進行管理,其中包含大量元素列表(可能會有成千上萬個)。以黑名單匹配爲例,我如何能非常有效地維護guvnor中的大黑名單? 有什麼想法?如何使用drools guvnor中的集合?

回答

1

模型是這樣的:

declare MyItem 
end 

declare MyList extends ArrayList 
end 

您需要使用公式的領域。點擊列表,然後新建公式並寫入

this contains myItem 

或者使用memberOf。現在再次使用公式爲MyItem

this memberOf myList 

您可以將每個黑名單項插入工作內存。這比使用memberOf或contains更高效。這也使得使用Guvnor編寫規則更容易。如果列表中包含字符串,你可以這樣做:

declared ListItem 
    name:String 
end 

您可以使用Drools的從列表中插入規則(也可以燒製Java代碼的規則之前做到這一點):

rule "Just to empty the list" 
when 
    list:List() 
then 
    for(String name:list) 
    insert(Item(name)); 
end 

現在您可以針對黑名單項目編寫規則。

+0

謝謝。我仍然懷疑,如果我在規則中使用List,它是否會有效地工作。黑名單存儲在數據庫中,當事實被插入到工作內存中時,我想檢查這個事實的字段(比如ID)是否在黑名單中。有沒有辦法讓黑名單對象始終保持工作記憶?所以每個規則匹配都是有效的。 '全球'能做到這一點嗎?我是新來的流口水,再次感謝你。 – fpwang

0

首先,我建議在開始優化應用程序設計之前測試一下。這可能是一個完整的非問題!

但是,如果你有一個巨大的黑名單,那麼將其插入工作內存可能是一個緩慢的步驟。事實插入會導致它通過Rete網絡傳播,並且取決於有多少規則取決於其內容,這可能是一個緩慢的過程。 Rete網絡更新後,後續評估應該很快。

因此,根據您的規則/會話如何操作,優化性能的一種技術可能是創建一個長時間運行的會話並在啓動時插入黑名單。有了這個,你可以插入一個'請求'的事實,看看什麼火災,然後收回請求,所以工作內存已準備好接下來的請求。

不幸的是,這確實引發了一些其他問題。例如,根據您的規則,您可能需要同步訪問會話,而不是共享。這導致了響應速度很快的情況,但也必須等待彼此完成,這可能是一個可伸縮性問題。如果這是一個問題,您可以創建一個會話池以支持多個用戶同時查詢。