ActiveMQ使用(一):在JavaScript中使用stomp.js

news2024/11/26 4:22:05

ActiveMQ使用(一):在JavaScript中使用stomp.js

1. 环境准备

  1. jQuery-1.10
    下载地址:https://www.jsdelivr.com/package/npm/jquery-1.10.2?tab=files
  2. stomp.js 2.3.3:
    下载地址:https://www.jsdelivr.com/package/npm/stompjs
    在这里插入图片描述

2. 相关代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="connect-input-box">
        <label for="host">host:</label>
        <input type="text" name="host" placeholder="input host" value="127.0.0.1"><br>
        <label for="port">port:</label>
        <input type="text" name="port" placeholder="input port" value="61614"><br>
        <label for="clientId">client id:</label>
        <input type="text" name="clientId" placeholder="input client id"><br>
        <label for="userId">user id:</label>
        <input type="text" name="userId" placeholder="input user id" value="user"><br>
        <label for="password">password:</label>
        <input type="text" name="password" placeholder="input password" value="pass"><br>
        <label for="destination">destination:</label>
        <input type="text" name="destination" placeholder="input destination" value="world"><br>
        <button id="connect" type="submit">connect</button>
        <button id="disconnect" type="submit">disconnect</button>
    </div>
    <div class="log-box">
        <p id="log-show"></p>
    </div>
    <div class="send-message-box">
        <label for="topic">topic:</label>
        <input type="text" name="topic"><br>
        <label for="queue">queue:</label>
        <input type="text" name="queue"><br>
        <input type="text" name="message"><br>
        <button id="send">send</button>
    </div>
    <div class="subscribe-box">
        <label for="subscribe-topic">subscribe-topic:</label>
        <input type="text" name="subscribe-topic">
        <button id="subscribe">subscribe</button>
    </div>
    <div class="unsubscribe-box">
        <label for="unsubscribe-topic"></label>
        <input type="text" name="unsubscribe-topic">
        <button id="unsubscribe">unsubscribe</button>
    </div>

    <script src="plugins/jquery-1.10.1.js"></script>
    <script src="plugins/stomp.js"></script>
    <script type="module">

        $(() => {
            console.log('mqtt: ', Stomp)
            $('input[name="clientId"]').val("example-" + Math.floor(Math.random() * 10000))

            if (!window.WebSocket) {
                console.log('不支持WebSocket')
            } else {
                
            }
        })

        var client, destination

        $('#connect').click(() => {
            var host = $('input[name="host"]').val()
            var port = $('input[name="port"]').val()
            var clientId = $('input[name="clientId"]').val()
            var user = $('input[name="userId"]').val()
            var password = $('input[name="password"]').val()

            destination = $('input[name="destination"]').val()
            console.log(host)

            // 创建一个client 实例
            let url = 'ws://' + host + ':' + port + '/stomp'
            client = Stomp.client(url)
            console.log(client)
            let headers = {
                login: user,
                passcode: password,
                'client-id': clientId
            }
            client.connect(headers, () => {
                console.log('connect success')
                client.subscribe(destination, (message) => {
                    if (message.body) {
                        console.log('get body ' + message.body)
                    } else {
                        console.log('got empty message')
                    }
                })
            }, () => {
                console.log('connect failed')
            })
        })

        // 断开连接
        $('#disconnect').click(() => {
            console.log('disconnect');
            client.disconnect(() => {
                console.log('disconnect')
            })
        })

        // 发送消息
        $('#send').click(() => {
            console.log('send')
            let topic = $('input[name="topic"]').val()
            let payload = $('input[name="message"]').val()
            let headers = {}
            client.send(topic, headers, payload)
        })

        var subscribeId = null

        // 订阅主题
        $('#subscribe').click(() => {
            console.log('subscribe')
            let topic = $('input[name="subscribe-topic"]').val()
            subscribeId = client.subscribe(topic, (message) => {
                if (message.body) {
                    console.log('message body: ' + message.body)
                } else {
                    console.log('empty message')
                }
            }, {id: '123123'})
        })

        // 取消订阅主题
        $('#unsubscribe').click(() => {
            console.log('unsubscribe')
            console.log(subscribeId);
            client.unsubscribe(subscribeId.id)
        })
    </script>
</body>
</html>

3. 结果展示

在这里插入图片描述

3.1 连接

在这里插入图片描述

3.2 订阅

在这里插入图片描述

3.3 发送消息

在这里插入图片描述

注意:默认发送点对点消息, 发送主题消息需要添加前缀/topic

在这里插入图片描述

3.4 取消订阅

在这里插入图片描述

3.5 断开连接

在这里插入图片描述

4. 相关参考

前端 Websocket + Stomp.js 的使用

stompjs的所有方法的使用

activemq BytesMessage || TextMessage

STOMP Over WebSocket

5. 注意

SprintBoot项目中集成ActiveMQ后,接收到的数据为字节数组
一种解决方式为:

@JmsListener(destination = "test_producer", containerFactory = "topicListenerContainer")
    public void receiveTestProducer(Message message) throws JMSException {
        String msg = StringUtils.activeMQMessageParse(message);
        System.out.println("收到测试生产者的消息: " + msg);
    }


public class StringUtils {

    /**
     * 将字符串进行分割并获得字节数组
     * @param str 待处理字符串
     * @param split 分割字符串
     * @return 字节数组
     */
    public static byte[] stringToBytes(String str, String split) {
        String[] strArr = str.split(split);
        byte[] byteArr = new byte[strArr.length];
        for (int i = 0; i < strArr.length; i++) {
            byteArr[i] = (byte) Integer.parseInt(strArr[i]);
        }
        return byteArr;
    }

    /**
     * 根据字节数组获取指定字符集的字符串
     * @param byteArr 字节数组
     * @param charset 编码字符集
     * @return 处理后的字符串
     */
    public static String bytesToString(byte[] byteArr, Charset charset) {
        return new String(byteArr, charset);
    }

    /**
     * 将字符串根据分隔符转成字节数组,然后转成指定字符集的字符串
     * @param str 待处理字符串
     * @param split 分割字符串
     * @param charset 指定字符集
     * @return 处理后的字符串
     */
    public static String stringToString(String str, String split, Charset charset) {
        return bytesToString(stringToBytes(str, split), charset);
    }

    /**
     * 将ActiveMQ接收到的消息转换为UTF-8字符串
     * @param message
     * @return
     */
    public static String activeMQMessageParse(Message message) {
        String str = null;
        if (message instanceof ActiveMQTextMessage) {
            ActiveMQTextMessage textMessage = (ActiveMQTextMessage) message;
            try {
                str = textMessage.getText().toString();
            } catch (JMSException e) {
                e.printStackTrace();
            }
//            System.out.println("text : " + textMessage.getText());
        } else if (message instanceof ActiveMQBytesMessage) {
            ActiveMQBytesMessage bytesMessage = (ActiveMQBytesMessage) message;
            byte[] byteArr = new byte[0];
            try {
                byteArr = new byte[(int) bytesMessage.getBodyLength()];
                int flag = bytesMessage.readBytes(byteArr);
                str = bytesToString(byteArr, StandardCharsets.UTF_8);
//                System.out.println("bytes : " + flag + " : " + str);
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
        return str;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/424068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

东用科技路由器连接上云助手配置指导手册

一、上云助手操作步骤1.安装“Device control center”并启动。2.点击“服务器设置”后设置端口号&#xff1a;1-65535&#xff0c;传输协议&#xff1a;TCP/UDP。##路由推送功能默认不勾选。其功能为将填写的远端子网及掩码信息推送给客户端&#xff0c;客户端就会生成一条目的…

java反序列化 cc链1 分析

这里我是跟白日梦组长学习&#xff0c;果然大佬就是大佬&#xff0c;讲的是真好&#xff0c;按他的配置&#xff0c;我们来配置环境。 环境搭建 环境&#xff1a; java&#xff1a;java8u_65 commons-collections&#xff1a;3.2.1 这里逛了很多圈&#xff0c;说实在的真的没有…

融云出海赋能会干货回顾 | 用户增长、场景玩法、安全合规实用指南

近期&#xff0c;“纵浪潜海 2023 融云社交泛娱乐出海赋能会”在上海、广州相继举行。移步【融云全球互联网通信云】&#xff0c;回复【出海】获取PPT。 作为更专业的出海服务商&#xff0c;融云联合多家出海服务企业&#xff0c;从热门出海地区的特性洞察、玩法解决方案、技…

BGP过滤(社团属性过滤器、AS路径过滤器)

通过路由策略来过滤 [r2]ip ip-prefix aa permit 172.16.1.0 24 [r2]route-policy aa deny node 10 [r2-route-policy]if-match ip-prefix aa [r2]route-policy aa permit node 20 [r2]bgp 200 [r2-bgp]peer 10.1.23.3 route-policy aa export 前缀列表进行过滤 [r3]ip ip-pref…

新手使用Python开发游戏pygame入门很合适-02

前面一篇博文&#xff0c;我们让飞机动起来了&#xff0c;但不是那么完美&#xff0c;我们继续来完善我们的游戏代码&#xff0c;本篇博文主要介绍获取按键的方式已经飞行速度的控制。 文章目录一、获取按键的三种方式1、通过event.get配合pygame.key枚举2、通过event.get配合o…

本地测试Segment Anything

一、下载GitHub代码 官网地址&#xff1a; https://github.com/facebookresearch/segment-anything git clone 或者 下载ZIP压缩包 二、下载.pth文件 官网中给出了三个训练好的参数文件 点击下载&#xff0c;我这里下载了最后一个358M大小的模型&#xff08;这里可以使用迅…

apache 配置与应用以及网页优化

Apache 配置与应用 --------构建虚拟 Web 主机-------- 虚拟Web主机指的是在同一台服务器中运行多个Web站点&#xff0c;其中每一个站点实际上并不独立占用整个服务器&#xff0c;因此被称为“虚拟”Web 主机。 通过虚拟 Web 主机服务可以充分利用服务器的硬件资源&#xff0c…

49.现有移动端开源框架及其特点—MACE( Mobile AI Compute Engine)

Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算设备优化的深度学习前向预测框架 MACE覆盖了常见的移动端计算设备(CPU,GPU和DSP),并且提供了完整的工具链和文档,用户借助MACE能够很方便地在移动端部署深度学习模型MACE已经在小米内部广泛使用并且被充分验证具…

答疑——20年国赛题(JAVA解法)

题目链接&#xff1a;用户登录https://www.lanqiao.cn/problems/1025/learning/?page3&first_category_id1&sortstudents_count 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老…

SQL笔记(1)——MySQL创建数据库(收藏吃灰版)

本文详细记录MySQL创建一个数据库的过程&#xff0c;不只是构建步骤&#xff0c;更多的是每一步涉及到的知识点。一般创建数据库有两种方式&#xff0c;一种是命令&#xff0c;另外一种就是通过数据库管理工具&#xff0c;本文主要记录通过命令的方式创建&#xff1b; 后面的学…

Centos7升级make和gcc版本到最新

Background 遇到如下的问题可能就是你make和gcc的版本过低了&#xff0c;需要升级。 *** These critical programs are missing or too old: make compiler *** Check the INSTALL file for required versions. 1、更新make版本 下载最新版本 【make最新安装包下载地址】 #…

VuePress1.x使用及个人博客搭建

文章目录介绍快速开始安装目录页面配置介绍 VuePress 由两部分组成&#xff1a;一个以 Vue 驱动的主题系统的简约静态网站生成工具&#xff0c;和一个为编写技术文档而优化的默认主题。它是为了支持 Vue 子项目的文档需求而创建的。 快速开始 安装 首先需要安装Node.js &…

ASM字节码处理工具原理及实践(一)

1. ASM简介 我们知道程序的分析。生成和转换是很有用的技术&#xff0c;可以用于很多场景。ASM作为一个Java字节码处理工具&#xff0c;它被设计用于处理已编译的Java类。ASM不是生成和转变已编译的Java类的唯一工具&#xff0c;但它是最新且最有效的工具之一。特点是体积小&a…

一个实现跳转到更多页面的黏性交互的通用组件

本文字数&#xff1a;3344字预计阅读时间&#xff1a;9分钟背景和现状随着移动互联网的快速发展&#xff0c;通信费用大幅降低&#xff0c;信息爆炸&#xff0c;应用软件展示的信息越来越来&#xff0c;为了有效地组织和展示信息&#xff0c;各大移动平台都提供了列表滚动组件方…

No.038<软考>《(高项)备考大全》【第22章】信息安全管理

【第22章】信息安全管理1 考试相关2 信息安全管理2.1 安全策略2.2 信息系统安全等级保护2.3 安全的概念适度安全的观点&#xff1a;木桶效应的观点&#xff1a;2.4 安全策略设计2.5 信息安全系统工程能力成熟度模型ISSE-CMM2.6数字证书护照和签证2.7访问控制授权方案2.8 安全审…

评估数据质量的指标总结1

评估数据质量的指标总结1 1、RMSE&#xff08;root mean square error&#xff09;均方根误差 作用&#xff1a;RMSE是估计的度量值与“真实”值之间的距离的度量。 计算方法&#xff1a; 2、相关系数r(coefficient of correlation ) 作用&#xff1a;皮尔逊相关系数&#xff…

LeetCode算法小抄--二叉树的各种构造

LeetCode算法小抄--各种情况的构造二叉树构造二叉树构造最大二叉树[654. 最大二叉树](https://leetcode.cn/problems/maximum-binary-tree/)从前序与中序遍历构造二叉树[105. 从前序与中序遍历序列构造二叉树](https://leetcode.cn/problems/construct-binary-tree-from-preord…

Unity和UE有啥区别?哪个更适合游戏开发

游戏制作软件中最著名的两个游戏引擎是 Unity 和 Unreal Engine。从独立游戏到大型工作室&#xff0c;许多游戏开发商都在使用它们。如果你打算从事游戏行业工作&#xff0c;你肯定曾经问过自己“我的游戏应该使用 Unity 还是 Unreal Engine&#xff1f;” ” 让我们来了解和比…

ActiveMQ使用(四):在JavaScript中发送的MQTT消息在SpringBoot中变为字节数组

ActiveMQ使用(四):在JavaScript中发送的MQTT消息在SpringBoot中变为字节数组 1. 问题描述 JmsListener(destination "test_producer", containerFactory "topicListenerContainer")public void receiveTestProducer(String message) throws JMSExceptio…

AI绘画兴起,Stable Diffusion脱颖而出,来一探究竟

近几年&#xff0c;AI图像生成风靡全球&#xff0c;它能够根据文字描述生成精美图像&#xff0c;这极大地改变了人们的图像创作方式。众多专业人士说该技术正在引领着新一轮深度学习创意工具浪潮&#xff0c;并有望彻底改变视觉媒体的创作。 AI绘画兴起 Stable Diffusion脱颖…