我需要通知所有用户向数据库中添加新的记录。所以,我有以下代码
-
Application.java-在这里我放置了套接字处理程序方法
public WebSocket<JsonNode> sockHandler() { return WebSocket.withActor(ResponseActor::props); }
-
然后我打开了连接
$(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) }});
-
我的演员类
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()); } }
-
最后,正如我所想,我需要从我的响应控制器中调用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
是什么?我在哪里可以在我的控制器中获得它?你能澄清一下通过网络套接字向所有客户端发送更新的逻辑吗?
我自己也在处理一个类似的问题,尽管是在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