我构建了一个Akka FSM,它在构造函数中生成两个子actor,只接收来自其中一个的消息。
val lhsRef: ActorRef = context.actorOf(Props(new PrimitiveNode(tpe)), "lhs")
val rhsRef: ActorRef = context.actorOf(Props(new PrimitiveNode(tpe)), "rhs")
在处理传入事件时,我想过滤那些来自lhsNode
的事件。我尝试通过以下方式实现此目的:
when(WaitFor1) {
case Event(event: SomeEventType, _) =>
// Control flow reaches this point but...
if (sender == lhsRef) {
// ...it never enters the if clause.
这不起作用。实际上,sender
和lhsNode
并不相同,即使它确实lhsNode
向我的FSM发送消息。
sender() Actor[akka://default/user/$a#670517729]
lhsNode Actor[akka://default/user/$a/$a/$b/lhs#-354253348]
我做错了什么?
答案 0 :(得分:1)
仅比较sender
和lhs
的名称。检查邮件是否真的由lhsNode
发送。
sender.path.name == "lhs"
或
sender.path.name = lhsNode.path.name
确保sender
仅为lhs
演员。 forward
如果任何其他参与者介入其中的消息。
如下所示
when(WaitFor1) {
case Event(event: SomeEventType, _) =>
// ...
if (sender.path.name == "lhs") {
// ....
使用模式匹配守卫
when(WaitFor1) {
case Event(event: SomeEventType, _) (if sender.path.name == "lhs") =>