2013-03-21 66 views
1

在我當前的項目中,我們使用事件系統來傳播沒有優先級的事件。我的意思是。問題在於沒有優先級調用事件,所以它意味着監聽類將它們添加到偵聽器容器中以激發他們的「消息」代碼。事件系統訂購問題

它可能會導致分析結果有時難以預測。

您是否知道任何現有解決方案能夠以「好方法」處理事件的排序?

回答

2

優先事件是地獄之路。沒有字面意思。 您需要跟蹤哪些對象需要什麼優先級。那麼你會用完優先事項。接下來你意識到你已經將相同的依賴關係(優先級常量類)硬編碼到了100個類中,並且將它們全部綁定在一起。也許不是,但是陷阱很多,而不是幽默。 你必須看看你想實現什麼: 你想要訂購流程執行順序。除了完全任意的事實,即事件觸發這些過程外,它與事件無關。

解決方法有很多:

  1. 使用finite state machine,目前最通用的和明確的解決方案。
  2. 隔離需要執行的進程,按順序觸發某個特定事件並以某種方式對它們進行排隊,例如使用command pattern並通過該事件觸發隊列中所有命令的執行。或者使用promises也是可能的。
  3. 事件鏈接正確的方式:如果ClassA需要響應事件A,但只有在ClassB完成其處理後,ClassA纔會響應事件A,而不是響應ClassB調度的事件。最不喜歡的,但有時候你需要快點。
1

在監聽器類中添加一個排序依賴標誌。這是假設監聽者A被調用,它對監聽者B有依賴性,然後讓B首先執行。同樣,您可以在所有監聽器類中放置依賴條件,從而創建所需的層次結構。

只要確保您不要添加循環依賴或仔細處理它。

1

PriorityBlockingQueue可能會幫你。使你的事件實現可比較,並且事件分派器線程每次都消耗最高優先級的事件。