带配置的Akka远程参与者选择

带配置的Akka远程参与者选择,akka,akka-cluster,Akka,Akka Cluster,是否有办法将远程参与者选择的配置设置为与远程参与者创建类似的配置,如中所述: 我不想为此定义自定义变量 system.actorSelection("sampleActor") 从文档中,参与者选择方法只有两种形式: 定义actorSelection(路径:ActorPath):actorSelection 从给定路径构造一个akka.actor.ActorSelection,它是 解析通配符(这些通配符被正则表达式替换) 内部)。未尝试验证该设备的任何部分是否存在 对于提供的路径,建议发送消

是否有办法将远程参与者选择的配置设置为与远程参与者创建类似的配置,如中所述:

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

system.actorSelection("sampleActor")

从文档中,参与者选择方法只有两种形式:

定义actorSelection(路径:ActorPath):actorSelection

从给定路径构造一个akka.actor.ActorSelection,它是 解析通配符(这些通配符被正则表达式替换) 内部)。未尝试验证该设备的任何部分是否存在 对于提供的路径,建议发送消息并收集 答复以解析匹配的参与者集

定义actorSelection(路径:字符串):actorSelection

构造 来自给定路径的akka.actor.ActorSelection,将对其进行解析 通配符(在内部由正则表达式替换)。不 试图验证所提供设备的任何部分是否存在 路径,建议在中发送消息并收集回复 以解析匹配的参与者集

而且ActorPath只是从字符串创建的:

def fromString(s:String):ActorPath

将字符串解析为参与者路径;如果无法执行此操作,则引发java.net.MalformedURLException

因此,仅仅通过在配置中设置一个特定的值,并没有一种直接的方法来选择参与者。然而,从配置中提取一个值并将其用于参与者选择是非常容易的。给定配置:

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"))
  }
}

谢谢,但这和使用自定义变量有什么区别呢?一点也不不同。你的问题的简短答案是“没有办法”,但我认为更全面的答案会更有用。
implicit class ActorSystemExtension(system: ActorSystem) {

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