从Play 2.4.1迁移到2.5.6-套接字

2020年2月27日 30点热度 0条评论

我已经将Play框架版本从 2.4.1 更新为 2.5.6 ,但是现在我在Web套接字管理方面遇到了问题。

我有一个Controller类,其中liveUpdate()方法返回WebSocket<String>实例。
在这种方法中,我在WebSocket.whenReady()中使用Out<String>来使用HashMap<Out<String>, String>,其中的键是客户端输出流,而值是包含语言信息的String,因为当我需要发送广播消息时,我会迭代HashMap

现在在 2.5.6 中已删除或弃用了所有这些内容!
在网上搜索时,我发现新的实现基于使用Flow类的 Akka Streams ,但我不知道如何适应我的代码。

  • 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

    如果您仍需要迁移的帮助,请告诉我,我会帮助您。