一、消息头:
消息头数据可以直接在send方法里面设置;
名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
JMSDestination |
javax.jms.Destination |
Set by the producer | 消息发送的目的地,分为queue和topic (只能在send方法中设置/实例化是设置) |
JMSReplyTo |
javax.jms.Destination |
null |
User defined. |
JMSType |
String |
"" |
User defined. |
JMSDeliveryMode |
int |
DeliveryMode.PERSISTENT |
持久化模式 对于一条持久化消息:应该被传送“一次仅仅一次”,这就意味着如果JMS提供者出现故障,该消息不会丢失,它会在服务器恢复之后再次传递 对于一条非持久化的消息:最多会传送一次,意味着服务器出现故障,该消息会丢失 static final int NON_PERSISTENT = 1; static final int PERSISTENT = 2; (只能在send方法中设置) |
JMSPriority |
int |
4 |
消息的优先级 从0-9十个级别,0-4普通消息,5-9加急消息,默认是4级。 JMS不要求mq严格按照这10个优先级发送消息,但必须保证加急消息要优于普通消息到达。 (只能在send方法中设置) |
JMSMessageID |
String |
unique |
MQ对每个消息产生的唯一标识的ID。无法设置,默认生成 |
JMSTimestamp |
long |
Time the message was sent | Time in milliseconds. |
JMSCorrelationID |
String |
null |
User defined. |
JMSExpiration |
long |
0 |
消息过期时间 可以设置消息在一定时间后过期,默认(0)永不过期 如果消息在过期时间达到之后还没发送到目的地,该消息就会被清除。 (只能在send方法中设置) |
JMSRedelivered |
boolean |
false |
true if the message is being resent to the consumer, persisted via persistJMSRedelivered |
发送消息,消息头属性举例说明:
1 package com.mock.utils; 2 3 import java.util.Calendar; 4 5 import javax.jms.Connection; 6 import javax.jms.JMSException; 7 import javax.jms.MessageProducer; 8 import javax.jms.Queue; 9 import javax.jms.Session; 10 import javax.jms.TextMessage; 11 12 import org.apache.activemq.ActiveMQConnectionFactory; 13 14 public class TestActiveMqProducerCanDelete { 15 private static final String ACTIVEMQ_URL = "tcp://192.168.2.189:61616"; 16 private static final String QUEUE_NAME = "queue_01"; 17 private static final String QUEUE_NAME_2 = "queue_02"; 18 19 public static void main(String[] args) throws JMSException { 20 // 创建连接工厂,按照给定的URL,采用默认用户名密码 21 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 22 // 通过连接工厂 获取connection 并启动访问 23 Connection conn = activeMQConnectionFactory.createConnection(); 24 conn.start(); 25 // 创建session会话 26 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 27 // 创建目的地 (具体是队列还是主题topic) 28 Queue queue = session.createQueue(QUEUE_NAME); 29 // 创建目的地 (具体是队列还是主题topic) 30 Queue queue2 = session.createQueue(QUEUE_NAME_2); 31 32 // 创建消息的生产者 33 MessageProducer messageProducer = session.createProducer(null); 34 35 for (int i = 0; i < 3; i++) { 36 // 创建消息;可以理解为学生按照要求写好问题 37 TextMessage textMessage = session.createTextMessage("mession-------" + i); 38 textMessage.setJMSMessageID(Calendar.getInstance().getTimeInMillis() + "x");// 不可以自定义 39 textMessage.setJMSType("map");// 可自定义 40 // 通过messageProducer 发送给mq 设置 目的地 、消息、持久化、优先级、过期时间 41 messageProducer.send(queue2, textMessage, 2, 5, 10000); 42 43 } 44 messageProducer.close(); 45 session.close(); 46 conn.close(); 47 System.out.println("发送消息成功"); 48 } 49 50 }
消费者消费:
1 package com.mock.utils; 2 3 import java.util.Calendar; 4 5 import javax.jms.Connection; 6 import javax.jms.JMSException; 7 import javax.jms.MessageProducer; 8 import javax.jms.Queue; 9 import javax.jms.Session; 10 import javax.jms.TextMessage; 11 12 import org.apache.activemq.ActiveMQConnectionFactory; 13 14 public class TestActiveMqProducerCanDelete { 15 private static final String ACTIVEMQ_URL = "tcp://192.168.2.189:61616"; 16 private static final String QUEUE_NAME = "queue_01"; 17 private static final String QUEUE_NAME_2 = "queue_02"; 18 19 public static void main(String[] args) throws JMSException { 20 // 创建连接工厂,按照给定的URL,采用默认用户名密码 21 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 22 // 通过连接工厂 获取connection 并启动访问 23 Connection conn = activeMQConnectionFactory.createConnection(); 24 conn.start(); 25 // 创建session会话 26 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 27 // 创建目的地 (具体是队列还是主题topic) 28 Queue queue = session.createQueue(QUEUE_NAME); 29 // 创建目的地 (具体是队列还是主题topic) 30 Queue queue2 = session.createQueue(QUEUE_NAME_2); 31 32 // 创建消息的生产者 33 MessageProducer messageProducer = session.createProducer(null); 34 35 for (int i = 0; i < 3; i++) { 36 // 创建消息;可以理解为学生按照要求写好问题 37 TextMessage textMessage = session.createTextMessage("mession-------" + i); 38 textMessage.setJMSMessageID(Calendar.getInstance().getTimeInMillis() + "x");// 不可以自定义 39 textMessage.setJMSType("map");// 可自定义 40 // 通过messageProducer 发送给mq 设置 目的地 、消息、持久化、优先级、过期时间 41 messageProducer.send(queue2, textMessage, 2, 5, 10000); 42 43 } 44 messageProducer.close(); 45 session.close(); 46 conn.close(); 47 System.out.println("发送消息成功"); 48 } 49 50 }
控制台打印结果:
优先级:5
持久化:2
过期时间:1659931102331
ID:ID:DESKTOP-V16T5JV-63651-1659931092159-1:1:1:1:1
type:map
收到消息:mession-------0
优先级:5
持久化:2
过期时间:1659931102358
ID:ID:DESKTOP-V16T5JV-63651-1659931092159-1:1:1:1:2
type:map
收到消息:mession-------1
优先级:5
持久化:2
过期时间:1659931102374
ID:ID:DESKTOP-V16T5JV-63651-1659931092159-1:1:1:1:3
type:map
收到消息:mession-------2
二、消息体:
activemq 提供了5种消息体格式:
- TextMessage:普通字符串消息,包含一个String
- MapMessage:一个map类型消息,key为String
- BytesMessage:二进制数组消息,包含一个byte[]
- StreamMessage:Java数据流消息,用标准流操作来顺序的填充和读取;
- ObjectMessage:对象消息,包含一个可序列号的Java对象
TextMessage 这里步骤赘述了;
MapMessage应用举例:
生产者:
1 public static void main(String[] args) throws JMSException { 2 // 创建连接工厂,按照给定的URL,采用默认用户名密码 3 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 4 // 通过连接工厂 获取connection 并启动访问 5 Connection conn = activeMQConnectionFactory.createConnection(); 6 conn.start(); 7 // 创建session会话 8 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 9 // 创建目的地 (具体是队列还是主题topic) 10 Queue queue = session.createQueue(QUEUE_NAME); 11 // 创建消息的生产者 12 MessageProducer messageProducer = session.createProducer(queue); 13 14 for (int i = 0; i < 3; i++) { 15 // 创建消息;可以理解为学生按照要求写好问题 16 MapMessage mapMessage = session.createMapMessage(); 17 mapMessage.setBoolean("boolean1", true); 18 mapMessage.setDouble("double", 1223); 19 mapMessage.setDouble("float", 1223); 20 mapMessage.setString("String", "xxxxxxxxxxxxxx"); 21 messageProducer.send(mapMessage); 22 } 23 messageProducer.close(); 24 session.close(); 25 conn.close(); 26 System.out.println("发送消息成功"); 27 }
消费者:
1 @SuppressWarnings("unchecked") 2 public static void main(String[] args) throws JMSException, IOException { 3 // 创建连接工厂,按照给定的URL,采用默认用户名密码 4 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 5 // 通过连接工厂 获取connection 并启动访问 6 Connection conn = activeMQConnectionFactory.createConnection(); 7 conn.start(); 8 // 创建session会话 9 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 10 // 创建目的地 (具体是队列还是主题topic) 11 Queue queue = session.createQueue(QUEUE_NAME); 12 13 // 创建目的地 (具体是队列还是主题topic) 14 Queue queue2 = session.createQueue(QUEUE_NAME_2); 15 16 // 创建消息的生产者 17 MessageConsumer messageConsumer = session.createConsumer(queue); 18 19 /** 20 * 同步阻塞方式(receive()) 订阅者或者接受者调用MessageConsumer的receive()方法来接受消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞; 21 */ 22 while (true) { 23 MapMessage mapMessage = (MapMessage) messageConsumer.receive(); 24 System.out.println("*********************"); 25 if (mapMessage != null) { 26 // 单个取值 27 Boolean b1 = mapMessage.getBoolean("boolean1"); 28 System.out.println("b1:" + b1); 29 // 遍历 30 Enumeration<String> mapNames = mapMessage.getMapNames(); 31 while (mapNames.hasMoreElements()) { 32 String key = (String) mapNames.nextElement(); 33 Object value = mapMessage.getObject(key); 34 System.out.printf("key:%s,value:%s%n", key, value); 35 } 36 } else { 37 break; 38 } 39 System.out.println("*********************"); 40 } 41 42 messageConsumer.close(); 43 session.close(); 44 conn.close(); 45 46 }
打印结果:
*********************
b1:true
key:boolean1,value:true
key:String,value:xxxxxxxxxxxxxx
key:float,value:1223.0
key:double,value:1223.0
*********************
*********************
b1:true
key:boolean1,value:true
key:String,value:xxxxxxxxxxxxxx
key:float,value:1223.0
key:double,value:1223.0
*********************
*********************
b1:true
key:boolean1,value:true
key:String,value:xxxxxxxxxxxxxx
key:float,value:1223.0
key:double,value:1223.0
*********************
BytesMessage
生产者:
1 public static void main(String[] args) throws JMSException { 2 // 创建连接工厂,按照给定的URL,采用默认用户名密码 3 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 4 // 通过连接工厂 获取connection 并启动访问 5 Connection conn = activeMQConnectionFactory.createConnection(); 6 conn.start(); 7 // 创建session会话 8 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 9 // 创建目的地 (具体是队列还是主题topic) 10 Queue queue = session.createQueue(QUEUE_NAME); 11 // 创建消息的生产者 12 MessageProducer messageProducer = session.createProducer(queue); 13 14 // Byte类型的数据 15 BytesMessage bytesMessage = session.createBytesMessage(); 16 bytesMessage.writeByte((byte) 12); 17 bytesMessage.writeShort((short) 12); 18 bytesMessage.writeInt(12); 19 bytesMessage.writeLong(1212); 20 bytesMessage.writeFloat(12.12f); 21 bytesMessage.writeDouble(8.88); 22 bytesMessage.writeBoolean(true); 23 bytesMessage.writeChar('a'); 24 bytesMessage.writeUTF("嘿嘿"); 25 messageProducer.send(bytesMessage); 26 27 messageProducer.close(); 28 session.close(); 29 conn.close(); 30 System.out.println("发送消息成功"); 31 }
消费者:
1 @SuppressWarnings("unchecked") 2 public static void main(String[] args) throws JMSException, IOException { 3 // 创建连接工厂,按照给定的URL,采用默认用户名密码 4 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 5 // 通过连接工厂 获取connection 并启动访问 6 Connection conn = activeMQConnectionFactory.createConnection(); 7 conn.start(); 8 // 创建session会话 9 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 10 // 创建目的地 (具体是队列还是主题topic) 11 Queue queue = session.createQueue(QUEUE_NAME); 12 13 // 创建目的地 (具体是队列还是主题topic) 14 Queue queue2 = session.createQueue(QUEUE_NAME_2); 15 16 // 创建消息的生产者 17 MessageConsumer messageConsumer = session.createConsumer(queue); 18 19 /** 20 * 同步阻塞方式(receive()) 订阅者或者接受者调用MessageConsumer的receive()方法来接受消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞; 21 */ 22 while (true) { 23 BytesMessage message = (BytesMessage) messageConsumer.receive(); 24 System.out.println("*********************"); 25 if (message != null) { 26 byte b = message.readByte(); 27 System.out.println("b:" + b); 28 short i = message.readShort(); 29 System.out.println("i:" + i); 30 int i1 = message.readInt(); 31 System.out.println("i1:" + i1); 32 long l = message.readLong(); 33 System.out.println("l:" + l); 34 float v1 = message.readFloat(); 35 System.out.println("v1:" + v1); 36 double v = message.readDouble(); 37 System.out.println("v:" + v); 38 boolean aBoolean = message.readBoolean(); 39 System.out.println("aBoolean:" + aBoolean); 40 char c = message.readChar(); 41 System.out.println("c:" + c); 42 String s = message.readUTF(); 43 System.out.println("s:" + s); 44 } else { 45 break; 46 } 47 System.out.println("*********************"); 48 } 49 50 messageConsumer.close(); 51 session.close(); 52 conn.close(); 53 54 }
控制台显示结果:
*********************
b:12
i:12
i1:12
l:1212
v1:12.12
v:8.88
aBoolean:true
c:a
s:嘿嘿
*********************
StreamMessage
StreamMesage携带了一个Java原始数据类型流作为有效负载。它提供了一套将格式化字节流映射为Java原始数据类型的简便方法。
StreamMessage保持了写入流时的顺序和原始数据类型,因此它适用于形式转换规则
生产者:
1 public static void main(String[] args) throws JMSException { 2 // 创建连接工厂,按照给定的URL,采用默认用户名密码 3 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 4 // 通过连接工厂 获取connection 并启动访问 5 Connection conn = activeMQConnectionFactory.createConnection(); 6 conn.start(); 7 // 创建session会话 8 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 9 // 创建目的地 (具体是队列还是主题topic) 10 Queue queue = session.createQueue(QUEUE_NAME); 11 // 创建消息的生产者 12 MessageProducer messageProducer = session.createProducer(queue); 13 14 // Byte类型的数据 15 StreamMessage message = session.createStreamMessage(); 16 message.writeString("stream string"); 17 message.writeInt(11111); 18 messageProducer.send(message); 19 20 messageProducer.close(); 21 session.close(); 22 conn.close(); 23 System.out.println("发送消息成功"); 24 }
消费者
1 @SuppressWarnings("unchecked") 2 public static void main(String[] args) throws JMSException, IOException { 3 // 创建连接工厂,按照给定的URL,采用默认用户名密码 4 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 5 // 通过连接工厂 获取connection 并启动访问 6 Connection conn = activeMQConnectionFactory.createConnection(); 7 conn.start(); 8 // 创建session会话 9 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 10 // 创建目的地 (具体是队列还是主题topic) 11 Queue queue = session.createQueue(QUEUE_NAME); 12 13 // 创建目的地 (具体是队列还是主题topic) 14 Queue queue2 = session.createQueue(QUEUE_NAME_2); 15 16 // 创建消息的生产者 17 MessageConsumer messageConsumer = session.createConsumer(queue); 18 19 /** 20 * 同步阻塞方式(receive()) 订阅者或者接受者调用MessageConsumer的receive()方法来接受消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞; 21 */ 22 while (true) { 23 StreamMessage message = (StreamMessage) messageConsumer.receive(); 24 System.out.println("*********************"); 25 if (message != null) { 26 System.out.println(message.readString()); 27 System.out.println(message.readInt()); 28 } else { 29 break; 30 } 31 System.out.println("*********************"); 32 } 33 34 messageConsumer.close(); 35 session.close(); 36 conn.close(); 37 38 }
控制台打印:
*********************
stream string
11111
*********************
ObjectMessage
生产者:
1 public static void main(String[] args) throws JMSException { 2 // 创建连接工厂,按照给定的URL,采用默认用户名密码 3 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 4 // 通过连接工厂 获取connection 并启动访问 5 Connection conn = activeMQConnectionFactory.createConnection(); 6 conn.start(); 7 // 创建session会话 8 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 9 // 创建目的地 (具体是队列还是主题topic) 10 Queue queue = session.createQueue(QUEUE_NAME); 11 // 创建消息的生产者 12 MessageProducer messageProducer = session.createProducer(queue); 13 14 // Byte类型的数据 15 ObjectMessage message = session.createObjectMessage(); 16 User user = new User(); 17 user.setAddress("嘉兴"); 18 user.setName("Joy"); 19 message.setObject(user); 20 messageProducer.send(message); 21 22 messageProducer.close(); 23 session.close(); 24 conn.close(); 25 System.out.println("发送消息成功"); 26 }
消费者:
额外设置 activeMQConnectionFactory.setTrustAllPackages(true);否则报错:
activemq This class is not trusted to be serialized as ObjectMessage payload .
1 @SuppressWarnings("unchecked") 2 public static void main(String[] args) throws JMSException, IOException { 3 // 创建连接工厂,按照给定的URL,采用默认用户名密码 4 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 5 activeMQConnectionFactory.setTrustAllPackages(true); 6 // 通过连接工厂 获取connection 并启动访问 7 Connection conn = activeMQConnectionFactory.createConnection(); 8 conn.start(); 9 // 创建session会话 10 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 11 // 创建目的地 (具体是队列还是主题topic) 12 Queue queue = session.createQueue(QUEUE_NAME); 13 14 // 创建目的地 (具体是队列还是主题topic) 15 Queue queue2 = session.createQueue(QUEUE_NAME_2); 16 17 // 创建消息的生产者 18 MessageConsumer messageConsumer = session.createConsumer(queue); 19 /** 20 * 同步阻塞方式(receive()) 订阅者或者接受者调用MessageConsumer的receive()方法来接受消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞; 21 */ 22 while (true) { 23 ObjectMessage message = (ObjectMessage) messageConsumer.receive(); 24 System.out.println("*********************"); 25 if (message != null) { 26 User user = (User) message.getObject(); 27 System.out.println(user); 28 } else { 29 break; 30 } 31 System.out.println("*********************"); 32 } 33 34 messageConsumer.close(); 35 session.close(); 36 conn.close(); 37 38 }
控制台打印:
*********************
User [id=null, name=Joy, address=嘉兴]
*********************
JMS消息属性:
- void setBooleanProperty(String name, boolean value) throws JMSException;
- void setByteProperty(String name, byte value) throws JMSException;
- void setShortProperty(String name, short value) throws JMSException;
- void setIntProperty(String name, int value) throws JMSException;
- void setLongProperty(String name, long value) throws JMSException;
- void setFloatProperty(String name, float value) throws JMSException;
- void setDoubleProperty(String name, double value) throws JMSException;
- void setStringProperty(String name, String value) throws JMSException;
- void setObjectProperty(String name, Object value) throws JMSException;
属性应用举例
生产者:
1 public static void main(String[] args) throws JMSException { 2 // 创建连接工厂,按照给定的URL,采用默认用户名密码 3 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 4 // 通过连接工厂 获取connection 并启动访问 5 Connection conn = activeMQConnectionFactory.createConnection(); 6 conn.start(); 7 // 创建session会话 8 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 9 // 创建目的地 (具体是队列还是主题topic) 10 Queue queue = session.createQueue(QUEUE_NAME); 11 // 创建消息的生产者 12 MessageProducer messageProducer = session.createProducer(queue); 13 14 // Byte类型的数据 15 ObjectMessage message = session.createObjectMessage(); 16 User user = new User(); 17 user.setAddress("嘉兴"); 18 user.setName("Joy"); 19 message.setObject(user); 20 message.setStringProperty("StringProperty", "我是 属性xxxxxxx"); 21 messageProducer.send(message); 22 23 messageProducer.close(); 24 session.close(); 25 conn.close(); 26 System.out.println("发送消息成功"); 27 }
消费者:
1 public static void main(String[] args) throws JMSException, IOException { 2 // 创建连接工厂,按照给定的URL,采用默认用户名密码 3 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 4 activeMQConnectionFactory.setTrustAllPackages(true); 5 // 通过连接工厂 获取connection 并启动访问 6 Connection conn = activeMQConnectionFactory.createConnection(); 7 conn.start(); 8 // 创建session会话 9 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 10 // 创建目的地 (具体是队列还是主题topic) 11 Queue queue = session.createQueue(QUEUE_NAME); 12 13 // 创建目的地 (具体是队列还是主题topic) 14 Queue queue2 = session.createQueue(QUEUE_NAME_2); 15 16 // 创建消息的生产者 17 MessageConsumer messageConsumer = session.createConsumer(queue); 18 /** 19 * 同步阻塞方式(receive()) 订阅者或者接受者调用MessageConsumer的receive()方法来接受消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞; 20 */ 21 while (true) { 22 ObjectMessage message = (ObjectMessage) messageConsumer.receive(); 23 System.out.println("*********************"); 24 if (message != null) { 25 System.out.println(message.getStringProperty("StringProperty")); 26 User user = (User) message.getObject(); 27 System.out.println(user); 28 } else { 29 break; 30 } 31 System.out.println("*********************"); 32 } 33 34 messageConsumer.close(); 35 session.close(); 36 conn.close(); 37 38 }
控制台输出:
*********************
我是 属性xxxxxxx
User [id=null, name=Joy, address=嘉兴]
*********************