ActiveMQ常见消息类型
JMS由下面三部分组成:消息头、属性、消息体。其中消息体定义了五种消息体格式,也可以称为消息类型。
JMS规范中的消息类型包括TextMessage、MapMessage、ObjectMessage、BytesMessage、和StreamMessage等五种。ActiveMQ也有对应的实现,下面我们结合Spring JMS分别来看一下五种消息类型的收发代码。类结构如下图:
下面结合spring研究常见的几种消息类型:
applicationContext.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--配置扫描注解的包--> <context:component-scan base-package="cn.qlq.jms"></context:component-scan> <!--Spring为我们提供的ConnectionFactory--> <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616"></property> </bean> <!--Spring jms为我们提供的连接池--> <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory"> <property name="targetConnectionFactory" ref="targetConnectionFactory"/> </bean> <!--一个队列的目的地,构造方法指定queueName,点对点模式--> <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg value="queue"></constructor-arg> </bean> <!--spring JMS提供的JmsTemplate--> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory"/> </bean> <!--消费消息容器(需要注入连接工厂,目的地,消息消费者监听器)--> <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory"/> <property name="destination" ref="queueDestination"/> <property name="messageListener" ref="myConsumer"/> </bean> <!--一个队列的目的地,构造方法指定queueName,点对点模式--> <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg value="topic"></constructor-arg> </bean> </beans>
1.最常见的 TextMessage
public void sendMessage(final String message) { jmsTemplate.send(destination, new MessageCreator() { public Message createMessage(Session session) throws JMSException { TextMessage textMessage = session.createTextMessage(message); return textMessage; } }); logger.info("send textMesage:{}",message); }
查看后台:
2.MapMessage发送Map消息
public void sendMessage(final String message) { jmsTemplate.send(destination, new MessageCreator() { public Message createMessage(Session session) throws JMSException { MapMessage mapMessage = session.createMapMessage(); mapMessage.setString("str",message); mapMessage.setBoolean("boolean",false); return mapMessage; } }); }
查看后台消息:
3.ObjectMessage发送序列化对象消息,Object必须实现Serializable接口
public void sendMessage() { jmsTemplate.send(destination, new MessageCreator() { public Message createMessage(Session session) throws JMSException { ObjectMessage objectMessage = session.createObjectMessage(); ArrayList<String> obj = new ArrayList(); obj.add("123"); obj.add("456"); objectMessage.setObject(obj); return objectMessage; } }); }
查看后台消息:
4. bytesMessage 发送字节消息
public void sendMessage() { jmsTemplate.send(destination, new MessageCreator() { public Message createMessage(Session session) throws JMSException { BytesMessage bytesMessage = session.createBytesMessage(); bytesMessage.writeBytes("str".getBytes()); bytesMessage.writeBoolean(false); return bytesMessage; } }); }
后台:
5.StreamMessage 发送Stream消息
public void sendMessage() { jmsTemplate.send(destination, new MessageCreator() { public Message createMessage(Session session) throws JMSException { StreamMessage streamMessage = session.createStreamMessage(); streamMessage.writeString("str"); streamMessage.writeInt(100); streamMessage.writeObject("obj"); return streamMessage; } }); }
消息的接受者:
public void onMessage(Message message) { try{ System.out.println(message.getClass()); // TextMessage if (message instanceof TextMessage) { TextMessage textMessage1 = (TextMessage) message; System.out.println(textMessage1.getText()); } // MapMessage if (message instanceof MapMessage) { MapMessage mapMessage = (MapMessage) message; System.out.println(mapMessage.toString()); } // ObjectMessage if (message instanceof ObjectMessage) { ObjectMessage objectMessage = (ObjectMessage) message; System.out.println(objectMessage.toString()); } // BytesMessage if (message instanceof BytesMessage) { byte[] b = new byte[1024]; int len = -1; BytesMessage bm = (BytesMessage) message; while ((len = bm.readBytes(b)) != -1) { System.out.println(new String(b, 0, len)); } } // StreamMessage if (message instanceof StreamMessage) { StreamMessage sm = (StreamMessage) message; System.out.println(sm.readString()); System.out.println(sm.readInt()); } }catch (Exception e){ } }
【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】
分类:
ActiveMQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了