ActiveMQ使用(四):在JavaScript中发送的MQTT消息在SpringBoot中变为字节数组
ActiveMQ使用(四):在JavaScript中发送的MQTT消息在SpringBoot中变为字节数组
1. 问题描述
@JmsListener(destination = "test_producer", containerFactory = "topicListenerContainer")public void receiveTestProducer(String message) throws JMSException {System.out.println("收到测试生产者的消息: " + message);}
- 使用浏览器客户端发送消息:
- 在
JavaScript
中发送消息
从上面的图片可以看到,JavaScript
发送的消息变成了字节数据
2. 解决
- 思路描述:
可以发现JavaScript
发送的是BytesMessage
,只要修改发送的数据为TextMessage
类型就可以了,但是我没找到这种思路的解决方法 - 字符串解码
通过判断数据类型,如果是TestMessage
就直接取出text
就是utf-8
形式的字符串,如果是BytesMessage
就取出字节数组,将字节数组转成utf-8
字符串就可以了
import org.apache.activemq.command.Message;@JmsListener(destination = "test_producer", containerFactory = "topicListenerContainer")public void receiveTestProducer(Message message) throws JMSException {String msg = StringUtils.activeMQMessageParse(message);System.out.println("收到测试生产者的消息: " + message);}package com.icebear.icedt.utils;import org.apache.activemq.command.ActiveMQBytesMessage;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.apache.activemq.command.Message;import javax.jms.JMSException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;/ @author icebear* @date 2023/4/13* @info 字符串工具类*/
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;}
}
3. 测试
3.1 浏览器
3.2 JavaScript
4. 参考
如何从ActiveMqMessage获取消息文本
activemq - 接收到的 ActiveMQBytesMessage 内容为空
https://activemq.apache.org/maven/apidocs/org/apache/activemq/command/ActiveMQBytesMessage.html
byte数组与字符串之间相互转换