2015-11-29 3 views
4

Мне нужно сообщить всем пользователям о добавлении новых Запись в базу данных. Итак, у меня есть следующий кодWebsockets, Play Framework и Actor

  1. Application.java - здесь я поставил гнездо обработчика метод

    public WebSocket<JsonNode> sockHandler() { 
        return WebSocket.withActor(ResponseActor::props); 
    } 
    
  2. Затем я открыл соединение

    $(function() { 
        var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket 
        var socket = new WS("@routes.Application.sockHandler().webSocketURL(request)") 
        socket.onmessage = function(event) { 
         console.log(event); 
         console.log(event.data); 
         console.log(event.responseJSON) 
        }}); 
    
  3. Мой Actor класс

    public class ResponseActor extends UntypedActor { 
        private final ActorRef out; 
        public ResponseActor(ActorRef out) { 
         this.out = out; 
        } 
        public static Props props(ActorRef out) { 
         return Props.create(ResponseActor.class, out); 
        } 
        @Override 
        public void onReceive(Object response) throws Exception { 
         out.tell(Json.toJson(response), self()); 
        } 
    } 
    
  4. И последнее, как мне кажется, мне нужно, чтобы вызвать актера из моего контроллера Ответа

    public Result addPost() { 
        Map<String, String[]> request = request().body().asFormUrlEncoded(); 
        Response response = new Response(request); 
        Map<String, String> validationMap = ResponseValidator.validate(response.responses); 
        if (validationMap.isEmpty()) { 
         ResponseDAO.create(response); 
         ActorRef responseActorRef = Akka.system().actorOf(ResponseActor.props(outRef)); 
         responseActorRef.tell(response, ActorRef.noSender()); 
         return ok(); 
        } else { 
         return badRequest(Json.toJson(validationMap)); 
        } 
    } 
    

Мой вопрос: что такое ActorRef, и где я могу получить его в мой контроллер? Не могли бы вы прояснить логику отправки обновлений всем клиентам через веб-сокеты?

ответ

0

Я работаю над подобной проблемой самостоятельно, хотя и в Scala, поэтому я посмотрю, смогу ли я помочь на основе того, что я узнал до сих пор (у меня возникают проблемы с получением сообщения мой актер после открытия гнезда).

Принятие подключения к WebSocket с актером не выполняется с типичной моделью запроса/ответа, например, с получением запроса GET на сервер для страницы. Вместо этого вам нужно использовать игру в WebSockets API:

import akka.actor.*; 
import play.libs.F.*; 
import play.mvc.WebSocket; 

public static WebSocket<String> socket() { 
    return WebSocket.withActor(ResponseActor::props); 
} 

Документация Play WebSockets должна быть в состоянии помочь вам там лучше, чем я могу: https://www.playframework.com/documentation/2.4.x/JavaWebSockets

Смежные вопросы