我已将我的 Play Framework 版本从 2.4.1 更新到 2.5.6 但现在我遇到了网络套接字管理问题。
我有一个 Controller 类,其中方法 liveUpdate()
返回 WebSocket<String>
实例。
在这种方法中,我使用 WebSocket.whenReady()
使用 Out<String>
在HashMap<Out<String>, String>
其中键是客户端输出流,值是 String
包含语言信息,因为当我需要发送广播消息时,我会迭代 HashMap
.
现在所有这些都在 2.5.6 中被删除或弃用了!
在网上搜索我发现新的实现是基于 Akka Streams 使用 Flow
类,但我不知道如何调整我的代码。
-
WebSocket.whenReady()
被WebSocket.Text.accept()
取代 -
Out<?>
用Flow
替换为 akka 流类
这是我的代码:
Alarms.java
public class Alarms extends Controller {
@Inject
private ActiveAlarms activeAlarms;
[...]
public WebSocket liveUpdate() {
return WebSocket.whenReady((in, out) -> {
in.onMessage(language ->{
activeAlarms.register(out, language);
});
in.onClose(() -> activeAlarms.unregister(out));
});
}
[...]
}
ActiveAlarms.java
public class ActiveAlarms{
private HashMap<Out<String>, String> websockets = new HashMap<>();
[...]
public void register(Out<String> out, String language) {
websockets.put(out, language);
updateWebsockets(out, language);
}
public void unregister(Out<String> out) {
websockets.remove(out);
}
private void updateWebsockets(Out<String> s, String lang){
if(s == null) return;
List<AlarmEvent> alarmsList = AlarmEvent.findActive();
ArrayList<AlarmEvent> translatedAlarmsList = new ArrayList<>();
//translate
alarmsList.forEach(e ->{
if(e != null) {
e.setAlarm(e.getAlarm().translate(checkLanguage(lang)));
translatedAlarmsList.add(e);
}
});
//WRITE TO SOCKET
String alarms = Json.stringify(Json.toJson(translatedAlarmsList));
try {
s.write(alarms);
} catch (Exception e2) {
Logger.debug("EX ActiveAlarms --> updateWebSocket " + e2.getMessage());
}
}
private void updateWebsockets(){
websockets.forEach(this::updateWebsockets);
}
[...]
}
关于如何将我的代码转换为 WebSocket
的新实现的任何想法?
最佳答案
我认为您可以轻松地从一个迁移到另一个。你查了吗this documentation ?
如果要用Akka流管理Socket,这个就是对应的documentation part .
如果您仍然需要迁移方面的帮助,请告诉我,我会帮助您。
关于java - 从 Play 2.4.1 迁移到 2.5.6 - 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39351103/