java - 从 Play 2.4.1 迁移到 2.5.6 - 套接字

标签 java playframework websocket akka akka-stream

我已将我的 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/

相关文章:

java - PowerMock,模拟使用静态方法的类的方法抛出空指针异常

java - 奇怪的异常传播到主线程

scala - 玩迁移替代方案

java - Play Framework 是如何运作的?

java - 使用 netty-socketio 服务器限制 websocket

java - 限制具有双应用程序功能的移动用户仅运行单个应用程序

java - jsf ajax 必须是同样的形式吗?

scala - 使用 Play 框架下载大文件

java - 可以通过 WebSocket 传递的最大数据量是多少?

json - Python3 : Grabbing data from Websocket and putting it into a DataFrame