Проблема создания актера Akka

Я пытаюсь создать актера, к которому можно получить доступ удаленно и локально. Актер, созданный ниже, выдает исключение. Есть идеи?

val myLocalActor2 = system.actorOf(Props[ActorNodes], name = "akka://[email protected]:2552/MyOwnRef")

Является ли это лучшим и единственным способом программного создания локального и удаленного актера?


person jts    schedule 18.05.2012    source источник


Ответы (2)


«Имя» в ActorOf — это просто сегмент пути. который идентифицирует вновь созданного актера. Дополнительную информацию об этом см. здесь: http://doc.akka.io/docs/akka/2.0.1/general/addressing.html

Кроме того, наличие чего-то одновременно локального и удаленного не имеет смысла, но я полагаю, вы имеете в виду, что оно должно быть локальным и быть доступным с какого-то удаленного узла? Если это так, просто создайте его с помощью actorOf, и другие узлы могут искать его с помощью «actorFor»:

val remoteActor = system.actorFor("akka://[email protected]:2552/user/simpleCalculator")

Подробнее об этом читайте здесь: http://doc.akka.io/docs/akka/2.0.1/scala/remoting.html

В общем, пожалуйста, прочитайте документацию, мы потратили на нее столько часов, и это кажется расточительным, когда люди ее не читают.

person Viktor Klang    schedule 19.05.2012
comment
Привет, Виктор, я действительно имел в виду, созданный локально, но доступный удаленно и локально прозрачно. Поэтому я хочу указать конкретный путь к локальному созданию актера, чтобы я мог просматривать его удаленно. Итак, действительно, вопрос в том, как мне назначить путь к моему локальному актеру с помощью ActorOf? Идея также состоит в том, чтобы передавать эту информацию, чтобы удаленным клиентам нужно было явно знать местоположение удаленного узла, но они могли бы найти его в каком-то глобальном реестре? (И, кстати, я прочитал документ) - person jts; 19.05.2012
comment
Чтобы иметь глобальный реестр, вам нужен консенсус, чтобы получить консенсус, вам нужна какая-то форма кластеризации. В настоящее время мы реализуем кластерное решение для Akka, но пока вам нужно решить это с помощью других средств консенсуса. - person Viktor Klang; 19.05.2012
comment
Ok. Спасибо. Думаю, я буду использовать какую-то трансляцию с использованием jGroups. - person jts; 19.05.2012

Получил работу (кроме глобального реестра):

case class ActorMsg(val msg: String)

sealed class ActorNodes extends Actor {
  override def receive = {
    case ActorMsg(msg) => println("Actor Msg " + msg)
    case _ => println("Everything else")
  }
}

object JtsListener extends App {
  val sys = "JtsSystem"
  val system = ActorSystem(sys)
//  println("System: " + system.settings)

  val myLocalActor1 = system.actorOf(Props[ActorNodes], "MyLocalRef")
  println("MyLocalActor 1: " + myLocalActor1 + " has path " + myLocalActor1.path)
  myLocalActor1 ! new ActorMsg("Hello")

  val myLocalActor2 = system.actorFor("akka://"+sys+"@127.0.0.1:2552/user/MyLocalRef");
  println("MyLocalActor 2: " + myLocalActor2 + " has path " + myLocalActor2.path)
  myLocalActor2 ! new ActorMsg("Hello Again")
}

с application.conf (я рассматриваю возможность сделать это программно на ActorSystem

Спасибо.

Следующим шагом будет передача этой информации, чтобы все службы знали, где находится каждый участник... возможно, используя изложенную здесь идею:

http://blog.vasilrem.com/even-simpler-scalability-with-akka-through-re

person jts    schedule 19.05.2012