如何在隔离函数中访问WebSocket连接

vngu2lb8  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(107)

我正在开发一个Ballerina WebSocket服务,目标是接收消息并将其广播到所有连接的WebSocket客户端。为了实现这一点,我希望对服务的“onMessage”功能进行一些修改。具体来说,我需要传递“connections”Map,它保存每个WebSocket客户端的connectionID。然而,我面临着一个问题,我不能访问这些连接,由于功能被隔离。
我想知道是否有一种解决方案可以让我访问这些连接,或者是否有其他方法可以满足我的要求?这是我试过的代码
这是我的代码

map<websocket:Caller> connections = {};

service class ASB {
    *websocket:Service;
    
    remote function onOpen(websocket:Caller caller) returns error? {
        connections[caller.getConnectionId()] = caller;
    }

    isolated remote function onMessage(string message) returns error? {
        check broadcast(message, connections);
    }
}

isolated function broadcast(string text, map<websocket:Caller> connections) returns error? {
    foreach websocket:Caller caller in connections {
        if caller is websocket:Caller {
            check caller->writeTextMessage(text);
        }
    }
}
lymgl2op

lymgl2op1#

解决方案是将模块级别的connectionsMap设置为孤立的。然后可以在广播消息中直接使用lock访问connections变量,如下所示。

import ballerina/websocket;

isolated map<websocket:Caller> connections = {};

service class ASB {
    *websocket:Service;
    isolated remote function onOpen(websocket:Caller caller) returns error? {
        lock {
            connections[caller.getConnectionId()] = caller;
        }
    }

    isolated remote function onMessage(string message) returns error? {
        check broadcast(message);
    }
}

isolated function broadcast(string text) returns error? {
    lock {
        foreach websocket:Caller caller in connections {
            if caller is websocket:Caller {
                check caller->writeTextMessage(text);
            }
        }
    }
}

有关更多详细信息,请参见isolated-variables

相关问题