【问题标题】:Possible to match mutliple received messages in Akka FSM可以匹配 Akka FSM 中收到的多个消息
【发布时间】:2014-09-30 15:42:43
【问题描述】:

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

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

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    您可以简单地让 TimeoutRejected 实现相同的 Trait 并匹配该 Trait。

    如果您在评论中写道,您无法更改 Timeout 和 Rejected 的类型/实现,您可能可以使用一个忽略类型的案例。如果您之前处理过所有其他情况,这应该可以工作。我会看起来像

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

    我不确定我的 _ 语法是否正确,但沿着这条线的东西应该可以工作。

    【讨论】:

    • 这几乎可以工作,但我正在使用我无法控制的 ADT。它们都实现了相同的基本特征。我可能会使用标记类型来拉皮条。如果没有其他人有更好的答案,我会接受这个,因为这是我首先想到的。
    • 我认为这是我们能做的最好的了。
    【解决方案2】:

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

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

    然后像这样在你的匹配语句中使用它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      相关资源
      最近更新 更多