2014-09-30 55 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) => 
相关问题