可以匹配Akka FSM中的多个收到的消息

时间:2014-09-30 15:42:44

标签: scala akka

是否可以使用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) =>

两种错误情况都会调用相同的处理函数并返回相同的结果,因此我更愿意通过事件处理来宣传这一事实

2 个答案:

答案 0 :(得分:6)

您可以让TimeoutRejected在该特征上实现相同的特性和匹配。

如果在评论中写入时无法更改Timeout和Rejected的类型/实现,则可以使用仅忽略类型的案例。如果您之前处理过所有其他案件,这应该有效。我看起来像

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

我不确定我的_语法是否合适,但是这一行应该有效。

答案 1 :(得分:1)

另一种选择是定义这样的自定义提取器:

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

然后在匹配语句中使用它,如下所示:

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