1
私はPhantomJSプロセスを開始してWebSockets経由で通信することができる簡単なプロジェクトに取り組んでいます。WebsocketAccepterの俳優からのメッセージは、Play 2.5でデッドレターに入ります。
class Application @Inject()(implicit actorSystem: ActorSystem, materializer: Materializer) extends Controller {
val manager = actorSystem.actorOf(Manager.props, "manager")
def index = Action {
Ok(views.html.main())
}
def socket = WebSocket.accept[String, String] { request =>
ActorFlow.actorRef(out => WebSocketAccepter.props(out, manager))
}
def start = Action {
manager ! "START"
Ok
}
マネージャの俳優は、単にPhantomJSを開始し、WSに接続します。私は私のコントローラで管理者の俳優とWSアクションを宣言しました。
すべてが正常に動作します、私はPhantomJSからのメッセージを開いてしまったが、次の私はマネージャーからいくつかの情報を取得し、PhantomJSに戻すしたいと思います:
class WebSocketAccepter(out: ActorRef, manager: ActorRef) extends Actor with ActorLogging {
...
def receive = {
case message: String => {
val json = Json.parse(message)
val messageType: String = (json \ "type").as[String]
messageType match {
case "OPEN" => {
(manager ? AskInfo).mapTo[RegInfo].map(info => {
out ! Json.toJson(info).toString()
})
}
...
}
私は、引数としてマネージャの俳優を渡すが、私が尋ねるとき、それは情報:
a.a.RepointableActorRef - Message [models.AskInfo$] from Actor[akka://application/temp/$a]
to Actor[akka://application/user/manager#-1822927709] was not delivered.
[1] dead letters encountered.
それは少し奇妙な、websocketの俳優は、下のパスに行く。どうしたの?
あなた 'manager'のアクターにManagerActorから開始する処理コードを取り出すことによって解決される問題は、' AskInfo'を受ける前に死亡している可能性があります。デバッグのために 'akka.actor.debug.lifecycle = on'という設定を追加しようとすることができます – vdebergue
これはManagerのアクターを直接起動しませんが、次のようになります:asiStreamSupervisor - started([email protected])aa LocalActorRefProvider $ Guardian - 現在、アクタ[akka:// application/user/manager#-507796102]を監督しています。 – cutoffurmind