【问题标题】:Websockets, Play Framework and ActorWebsockets、Play 框架和 Actor
【发布时间】:2016-03-03 07:10:04
【问题描述】:

我需要通知所有用户向数据库添加新的记录。 所以,我有以下代码

  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. 最后,我认为,我需要从我的响应控制器调用 Actor

    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 输出是什么,我在控制器中的哪里可以得到它? 您能否阐明通过 Web 套接字向所有客户端发送更新的逻辑?

【问题讨论】:

    标签: java ajax playframework websocket actor


    【解决方案1】:

    我自己也在解决一个类似的问题,虽然是在 Scala 中,所以我会看看我是否可以根据我目前所学的知识提供帮助(我在将消息发送给我时遇到了自己的问题套接字打开后的演员)。

    接受与参与者的 WebSocket 连接不是通过典型的请求/响应模型完成的,例如向服务器发出 GET 请求以获取页面。相反,您需要使用 Play 的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多