从Play 2.4.1迁移到2.5.6 - 套接字

Dav*_*ola 7 java websocket akka playframework akka-stream

我已将我的Pl​​ay Framework版本从2.4.1更新到2.5.6,但现在我遇到了Web套接字管理问题.

我有一个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

这是我的代码:

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));
        });
    }

    [...]
}
Run Code Online (Sandbox Code Playgroud)

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);
    }

    [...]
}
Run Code Online (Sandbox Code Playgroud)

有关如何将我的代码转换为新实现的任何想法WebSocket

Bsq*_* ℬℬ -3

我认为您可以轻松地从一种迁移到另一种。你检查过这个文档吗?

如果你想用 Akka 流管理 Socket,这是相应的文档部分

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