1. 新建一个名为JMSActiveMQMapMessage的Java项目, 同时拷入相关jar包
2. 编辑QueueMapMessageProducer.java
package com.jms.activemq.qmm;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class QueueMapMessageProducer {
// 默认连接用户名
private static final String dftUsr = ActiveMQConnection.DEFAULT_USER;
// 默认用户密码
private static final String dftPwd = ActiveMQConnection.DEFAULT_PASSWORD;
// 默认连接地址
private static final String dftUrl = ActiveMQConnection.DEFAULT_BROKER_URL;
// 队列名称
private static final String queueName = "queueMapMsg";
public static void main(String[] args) {
// 1. 创建一个连接工厂
QueueConnectionFactory cf = new ActiveMQConnectionFactory(dftUsr, dftPwd, dftUrl);
// 连接对象
QueueConnection conn = null;
// 会话对象
QueueSession session = null;
try {
// 2. 创建连接
conn = cf.createQueueConnection();
// 3. 启动连接
conn.start();
// 4. 创建会话
session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
// 5. 创建消息目的地。如果是点对点, 那么它的实现是Queue; 如果是订阅模式, 那它的实现是Topic。这里我们创建一个名为queueMapMsg的消息队列。
Queue queue = session.createQueue(queueName);
// 6. 消息生产者
QueueSender sender = session.createSender(null);
// 7. 创建文本消息和发送消息
for(int i = 0; i < 2; i++) {
MapMessage message = session.createMapMessage();
message.setLong("id", 100000000000L + i);
message.setString("name", "lisi");
sender.send(queue, message);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
if (session != null) {
session.close();
}
} catch (JMSException e1) {
e1.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
}
3. 编辑QueueMapMessageConsumer.java
package com.jms.activemq.qmm;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class QueueMapMessageConsumer {
// 默认连接用户名
private static final String dftUsr = ActiveMQConnection.DEFAULT_USER;
// 默认用户密码
private static final String dftPwd = ActiveMQConnection.DEFAULT_PASSWORD;
// 默认连接地址
private static final String dftUrl = ActiveMQConnection.DEFAULT_BROKER_URL;
// 队列名称
private static final String queueName = "queueMapMsg";
public static void main(String[] args) {
// 1. 创建一个连接工厂
QueueConnectionFactory cf = new ActiveMQConnectionFactory(dftUsr, dftPwd, dftUrl);
// 连接对象
QueueConnection conn = null;
// 会话对象
QueueSession session = null;
try {
// 2. 创建连接
conn = cf.createQueueConnection();
// 3. 创建会话
session = conn.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
// 4. 创建消息目的地。如果是点对点, 那么它的实现是Queue; 如果是订阅模式, 那它的实现是Topic。这里我们创建一个名为queueMapMsg的消息队列。
Queue queue = session.createQueue(queueName);
// 5. 消息消费者
QueueReceiver receiver = session.createReceiver(queue);
// 6. 启动连接, 准备开始接收消息
conn.start();
// 7. 接收消息
MapMessage message = (MapMessage) receiver.receive(1000 * 3);
System.out.println("接收: id = " + message.getLong("id") + ", name = " + message.getString("name"));
MapMessage message1 = (MapMessage) receiver.receive(1000 * 3);
System.out.println("接收: id = " + message1.getLong("id") + ", name = " + message1.getString("name"));
// 8. 客户端主动确认消息已成功接收。进行了一次确认, 却确认了2条消息的消费, 因为这种确认方式是会话级别的。
message.acknowledge();
System.out.println("JMSDestination = " + message.getJMSDestination() + ", JMSDeliveryMode = " + message.getJMSDeliveryMode()
+ ", JMSExpiration = " + message.getJMSExpiration() + ", JMSPriority = " + message.getJMSPriority()
+ ",\r\nJMSMessageID = " + message.getJMSMessageID() + ", JMSTimestamp = " + message.getJMSTimestamp()
+ ", JMSCorrelationID = " + message.getJMSCorrelationID() + ",\r\nJMSReplyTo = " + message.getJMSReplyTo()
+ ", JMSType = " + message.getJMSType() + ", JMSRedelivered = " + message.getJMSRedelivered());
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
if (session != null) {
session.close();
}
} catch (JMSException e1) {
e1.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
}
4. 运行QueueMapMessageProducer.java
5. 注释掉确认消息代码, 运行QueueMapMessageConsumer.java
6. 放开确认消息代码, 再次运行QueueMapMessageConsumer.java