Azure Web Pub Sub Service - JAVA

概述

使用 Azure Web PubSub 开发具有实时消息传递的 Web 应用程序,这是一种支持本机和无服务器 WebSocket 的完全托管服务。 使用发布-订阅消息模式创建松散耦合、可扩展的应用程序 - 包括聊天、直播和 IoT 仪表板。 当 Web PubSub 管理数据和内容流向您的网页和移动应用程序时,开发者可以专注于功能。

概念

连接

连接,也称为客户端或客户端连接,表示连接到 Web PubSub 服务的单个 WebSocket 连接。成功连接后,Web PubSub 服务会为此连接分配一个唯一的连接 ID。

中心

hub是一组客户端连接的逻辑概念。通常您将一个hub用于一个目的,例如,聊天hub或通知hub。当客户端连接时,它连接到一个hub,并且在其生命周期内,它属于该hub。一旦客户端连接到hub,hub就存在。不同的应用程序可以使用不同的hub名称共享一个 Azure Web PubSub 服务。

组是到hub的连接子集。您可以随时将客户端连接添加到组,或从组中删除客户端连接。例如,当客户加入聊天室时,或者当客户离开聊天室时,该聊天室可以被认为是一个群组。一个客户端可以加入多个组,一个组可以包含多个客户端。群组就像一个群组“会话”,一旦有人加入群组就会创建群组会话,当群组中没有人时会话消失。

用户

与 Web PubSub 的连接可以属于一个用户。一个用户可能有多个连接,例如当一个用户跨多个设备或多个浏览器选项卡连接时。

留言

当客户端连接时,它可以通过 WebSocket 连接向上游应用程序发送消息,或从上游应用程序接收消息。

工作流程

客户端使用 WebSocket 传输连接到服务/客户端端点。服务将每个 WebSocket 帧转发到配置的上游(服务器)。 WebSocket 连接可以与任何自定义子协议连接以供服务器处理,也可以与服务支持的子协议 json.webpubsub.azure.v1 连接,这使客户端能够直接进行 pub/sub。详细信息在客户端协议中进行了描述。

服务在不同的客户端事件上使用 CloudEvents HTTP 协议调用服务器。 CloudEvents 是由云原生计算基金会 (CNCF) 托管的事件的结构和元数据描述的标准化且与协议无关的定义。详细信息在服务器协议中描述。

服务器可以使用 REST API 调用服务向客户端发送消息或管理连接的客户端。详细信息在服务器协议中描述

创建一个web pub sub service

连接 webPubSubServiceClient

导入maven

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-messaging-webpubsub</artifactId>
    <version>1.1.4</version>
</dependency>

从Azure获取connectionString并确定Hub

WebPubSubServiceClient webPubSubServiceClient = new WebPubSubServiceClientBuilder()
        .connectionString(" ")
        .hub(" ")
        .buildClient();

连接webSocket

创建token

GetClientAccessTokenOptions getClientAccessTokenOptions = new GetClientAccessTokenOptions();
getClientAccessTokenOptions.addRole("webpubsub.sendToGroup");
getClientAccessTokenOptions.addRole("webpubsub.joinLeaveGroup");
WebPubSubClientAccessToken token = webPubSubServiceClient.getClientAccessToken(getClientAccessTokenOptions);

创建WebSocket并确定使用的数据传输协议

String url = token.getUrl();
ws = HttpClient.newHttpClient().newWebSocketBuilder().subprotocols("json.webpubsub.azure.v1")
        .buildAsync(URI.create(url), new WebSocketClient()).join();

实现WebSocket message listener(基于使用的WebSocket依赖不同,实现方式也不同)

private static final class WebSocketClient implements WebSocket.Listener {
    private WebSocketClient() {
    }

    @Override
    public void onOpen(WebSocket webSocket) {
        log.info("subscriber open");
        WebSocket.Listener.super.onOpen(webSocket);
    }

    @Override
    public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
        log.info("Message received:{}", data);
        return WebSocket.Listener.super.onText(webSocket, data, last);
    }

    @Override
    public void onError(WebSocket webSocket, Throwable error) {
        System.out.println("Bad day! " + webSocket.toString());
        WebSocket.Listener.super.onError(webSocket, error);
    }
}

信息

AckId

使用 ackId 时,你可以在你的请求被处理时收到确认响应消息。 可以在即发即弃场景中选择省略 ackId。
Web PubSub 服务将为具有 ackId 的每个请求发送确认响应。

public class AckResponseMessage {
    private String type;
    private String ackId;
    private boolean success;
    private Error error;

    public static class Error{
        private String name;
        private String message;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }
    }
}

发送至组

public class SendGroupMessage {
    public final String type = "sendToGroup";
    public String data;
    public int ackId;
    public String group;
    public boolean noEcho;
    public DataType dataType;

    public SendGroupMessage(String data, int ackId, String group, boolean noEcho, DataType dataType) {
        this.data = data;
        this.ackId = ackId;
        this.group = group;
        this.noEcho = noEcho;
        this.dataType = dataType;
    }
}

加入组

public class JoinGroupMessage {
    public int ackId;
    public final String type = "joinGroup";
    public String group;

    public JoinGroupMessage(int ackId, String group){
        this.ackId = ackId;
        this.group = group;
    }
}

退出组

public class LeaveGroupMessage {
    public int ackId;
    public final String type = "leaveGroup";
    public String group;

    public LeaveGroupMessage(int ackId, String group){
        this.ackId = ackId;
        this.group = group;
    }
}

收到来自组的消息

public class ReceivedGroupMessage {
    private String type;
    private String from;
    private String fromUserId;
    private String group;
    private DataType dataType;
    private String data;
}

收到来自服务器的消息

public class ReceivedServerMessage {
    private String type;
    private String from;
    private DataType dataType;
    private String data;
}

系统响应

public class ConnectedSystemMessage {
    private String type;
    private String event;
    private String userId;
    private String connectionId;
}

public class DisConnectedSystemMessage {
    private String type;
    private String event;
    private String message;
}

发布与订阅

发布

public void sendToGroup(String data,String group) {
    ++ackId;
    GroupMessage groupMessage = new GroupMessage(data, ackId, group);
    String string = null;
    try {
        string = objectMapper.writeValueAsString(groupMessage);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    ws.sendText(string,true);
}

订阅

@Override
public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
    try {
        String message = String.valueOf(data);
        handleData(message);
    } catch (Exception e) {
        log.warn("e:{}", e.getMessage());
    }
    return WebSocket.Listener.super.onText(webSocket, data, last);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340