2014-09-30 76 views
3

是否可以使用Akka FSM事件功能在單個案例/事件中匹配多個消息。含義我想將兩個事件合併爲一個事件。可能與Akka FSM中收到的多條消息匹配

case Event(response : GoodResponse, session:CustomerSession) => 
case Event(response : Timeout, session:CustomerSession) => 
case Event(response : Rejected, session:CustomerSession) => 

成爲像

case Event(response : GoodResponse, session:CustomerSession) => 
case Event(response : Timeout || response : Rejected , session:CustomerSession) => 

兩個錯誤的情況下調用相同的處理功能,並返回相同的結果,所以我寧願通過事件處理

回答

6

你可以簡單地必須反映該事實TimeoutRejected在該特徵上實現相同的特徵並匹配。

如果您在註釋中編寫的內容不能更改Timeout和Rejected的類型/實現,那麼您可能會使用一個只忽略該類型的大小寫。如果你以前處理過所有其他案例,這應該可行。我會看起來像

case Event(response : GoodResponse, session:CustomerSession) => 
case Event(response : _, session:CustomerSession) => 

我不知道如果我有_語法正確,但沿着這條線的東西應該工作。

+0

這幾乎工作,但我使用的是ADT這是我無法控制的。他們都實施相同的基本特徵。我可能會使用標記類型來拉扯它們。如果沒有其他人有更好的答案,我會接受這個,因爲這是我首先想到的。 – bearrito 2014-09-30 15:49:50

+0

@ bearrito更新了我的答案 – 2014-09-30 15:53:39

+0

我認爲這是我們能做的最好的。 – bearrito 2014-09-30 15:55:42

1

另一種方法是定義一個定製提取這樣的:

object RejectedOrTimeout{ 
    def unapply(value:Any) = { 
    if (value.isInstanceOf[Rejected] || value.isInstanceOf[Timeout]) Some(value) 
    else None 
    } 
} 

,然後用它在你的匹配語句如下:

case Event(RejectedOrTimeout(response), session:CustomerSession) =>