Как отправлять сообщения в систему akka в соседнем jvm?

Я запустил систему akka с HelloActor в одной JVM и пытался отправить ему сообщения от клиента в другой JVM. И ничего не работает. Как я должен сделать это правильно? Вот код:

Простой сервер

package akkaSample.severalSystems

    import akka.actor.{Props, Actor, ActorSystem}
    import com.typesafe.config.ConfigFactory

    class HelloActor extends Actor {
        override def preStart(): Unit = {
            println("Hello actor started")
        }

        def receive = {
            case "mew" => println("I said mew")
            case "hello" => println("hello back at you")
            case "shutdown" => context.stop(self)
            case _       => println("huh?")
        }
    }

    object Server extends App {
        val root = ConfigFactory.load()
        val one  = root.getConfig("systemOne")
        val system = ActorSystem("HelloSystem", one)
        val helloActor = system.actorOf(Props[HelloActor], "HelloActor")
        println (system)
        println("Remote application started.")
    }

Простой клиент

package akkaSample.severalSystems.client

import akka.actor.ActorSystem
import com.typesafe.config.ConfigFactory
import scala.util.control.Breaks._

class Client {

}

object Client extends App {
    println("started")

    val root = ConfigFactory.load()
    val two  = root.getConfig("systemTwo")
    val system = ActorSystem("mySystem", two)
    //What should be there to access HelloActor?
    val selection = ...
    selection ! "mew"
    println(selection.anchorPath)
}

конфигурационный файл

systemOne {
  akka {
    remote {
      enabled-transports = ["akka.remote.netty.tcp"]
      netty.tcp {
        port = 2552
      }
    }
  }
}

systemTwo {
  akka {
    remote {
      enabled-transports = ["akka.remote.netty.tcp"]
      netty.tcp {
        port = 2553
      }
    }
  }
}

Предполагается, что сервер запускается до клиента. Теперь я получаю "akka: // mySystem / deadLetters" (println(selection.anchorPath)) когда пытаешься получить такого актера system.actorSelection("akka://HelloSystem@127.0.0.1:2552/HelloActor")

Так как же извлечь актера из ActorSystem в другую JVM? Или это невозможно, пока я не создам кластер, не назначу семена, лидера и так далее?

1 ответ

Решение

Кажется, вы пропустили добавление RemoteActorRefProvider в конфигурации. Ваша конфигурация актера должна быть такой:

systemOne {
   akka {
     actor {
      provider = "akka.remote.RemoteActorRefProvider"
    }
     remote {
       enabled-transports = ["akka.remote.netty.tcp"]
       netty.tcp {
         port = 2552
       }
     }
  }
}

systemTwo {
  akka {
    actor {
      provider = "akka.remote.RemoteActorRefProvider"
    }
    remote {
      enabled-transports = ["akka.remote.netty.tcp"]
      netty.tcp {
        port = 2553
      }
    }
  }
}

Выбор актера осуществляется с использованием

context.actorSelection("akka.tcp://actorSystemName@10.0.0.1:2552/user/actorName")

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

Это изменение конфигурации RemoteActorRefProvider требует akka-remote как зависимость.

Другие вопросы по тегам