【问题标题】:Akka Remote actor selection with configuration带有配置的 Akka 远程参与者选择
【发布时间】:2015-11-13 12:56:20
【问题描述】:

有没有办法为远程参与者 selection 设置类似于Akka docs 中指定的远程参与者creation 的配置:

akka {
  actor {
    deployment {
      /sampleActor {
        remote = "akka.tcp://sampleActorSystem@127.0.0.1:2553"
      }
    }
  }
}

我不想为此定义自定义变量。

system.actorSelection("sampleActor")

【问题讨论】:

    标签: akka akka-cluster


    【解决方案1】:

    演员选择方法只有两种形式,来自文档:

    def actorSelection(path: ActorPath): ActorSelection

    从给定的路径构造一个akka.actor.ActorSelection,即 解析通配符(这些被正则表达式替换 内部)。没有尝试验证任何部分的存在 提供的路径,建议发送消息并收集 回复以解析匹配的演员集。

    def actorSelection(path: String): ActorSelection

    构造 来自给定路径的 akka.actor.ActorSelection,它被解析为 通配符(它们在内部被正则表达式替换)。不 试图验证所提供的任何部分的存在 路径,建议发送消息并收集回复 为了解决匹配的演员集。

    无论如何,ActorPath 都是从字符串创建的:

    定义 fromString(s: String): ActorPath

    将字符串解析为actor路径;如果无法这样做,则抛出 java.net.MalformedURLException。

    所以没有直接的方法来选择演员,只需在 config.xml 中设置一个特定的值。然而,很容易从配置中提取一个值并将其用于角色选择。给定配置:

    akka {
      actor {
        selections: {
          sampleActor: {
            path: "akka.tcp://sampleActorSystem@127.0.0.1:2553/user/sampleActor"
          }
        }
      }
    }
    

    你可以使用:

    val sampleActorSelection = 
      system.actorSelection(
        system.settings.config.getString("akka.actor.selections.sampleActor.path"))
    

    如果这是您发现自己经常使用的方法,您可以使用隐式类向系统添加辅助方法:

    implicit class ActorSystemExtension(system: ActorSystem) {
    
      def actorSelectionFromConfig(actorName: String): ActorSelection {
        system.actorSelection(
            system.settings.config.getString(s"akka.actor.selections.${actorName}.path"))
      }
    }
    

    【讨论】:

    • 谢谢,但是使用自定义变量有什么不同?
    • 根本没有什么不同。对您的问题的简短回答是“不,没有办法”,但我认为更全面的答案会更有用。
    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 2012-11-09
    • 2021-12-31
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    相关资源
    最近更新 更多