一、消息头:
消息头数据可以直接在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 // 不可以自定义
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
View Code
控制台打印结果:
优先级: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
View Code
消费者:
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
View Code
打印结果:
*********************
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
View Code
消费者:
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
View Code
控制台显示结果:
*********************
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
View Code
消费者
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
View Code
控制台打印:
*********************
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
View Code
消费者:
额外设置 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
View Code
控制台打印:
*********************
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
View Code
消费者:
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
View Code
控制台输出:
*********************
我是 属性xxxxxxx
User [id=null, name=Joy, address=嘉兴]
*********************
我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。
我要做一个自由又自律的人,靠势必实现的决心认真地活着。