我需要通知所有用户有关向数据库添加新记录的信息。 所以,我有以下代码
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
是什么,我可以在控制器中找到它?
您能否澄清一下通过网络套接字向所有客户发送更新的逻辑?
答案 0 :(得分:0)
我正在研究一个类似的问题,我自己,虽然在Scala中,所以我会看看我是否可以根据我到目前为止学到的东西提供帮助(我在将信息传达给我时遇到了自己的问题套接字打开后的演员)。
接受与actor之间的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