想了解一下消息队列的使用,因为AMQ是使用较多的一个,所以就以AMQ为对象了解学习。
首先是去官网下载,这里要注意AMQ依赖的Java版本不一样。像我一开始下载的最新的5.15版本,但是依赖的Java版本是1.8,而测试的机器使用的是1.7。无奈在查询后又重新下载了5.14版本使用。
下载之后解压,进入bin目录下,如图:
点击win64下的activemq.bat脚本启动AMQ服务。
这是启动成功后的输出信息。在服务启动成功后可以通过http://127.0.0.1:8161/admin地址进入管理界面查看相关信息。
接下来就是写测试代码简单的实验一下消息队列(这里以P2P模式为例):
首先是写一个消息发布者的类:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* AMQ消息发布者
*
*
*/
public class AmqProducer {
// 发布消息数量
private static final Integer SENDNUM = 7;
/**
* 发送消息的方法
*
* @param session
* @param producer
* @throws JMSException
*/
public static void sendMessage(Session session, MessageProducer producer) throws JMSException {
TextMessage message = null;
for (int i = 0; i < SENDNUM; i++) {
message = session.createTextMessage("AMQ message" + i);
producer.send(message);
}
}
public static void main(String[] args) {
// 连接工厂
ConnectionFactory connectionFactory;
// 连接
Connection connection = null;
// 会话
Session session;
// 消费地址
Destination destination;
// 发布者
MessageProducer producer;
// 实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL);
try {
// 获取连接
connection = connectionFactory.createConnection();
// 启动连接
connection.start();
// 创建会话
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// 创建消息队列
destination = session.createQueue("MyAmq");
// 创建发布者
producer = session.createProducer(destination);
// 发送消息
sendMessage(session, producer);
// 事务提交
session.commit();
} catch (JMSException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
这里注意createSession(param1,param2)这个方法,这个方法的两个参数param1是表示是否开启事务,param2表示使用何种确认接收机制。
–param1设置为false时,关闭事务:
param2的值可为 Session.AUTO_ACKNOWLEDGE,Session. CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
–param1设置为true时,开启事务:
param2可任意取值,因为这里确认机制会被默认为SESSION_TRANSACTED(事务提交并确认)
这里可以看出实际上事务和确认机制是互斥的,两者取其一使用。
再来看看几种确认机制的信息:
AUTO_ACKNOWLEDGE:自动确认机制,从字面上意思也可以猜到,当会话对接收到的每条信息都会自动发送确认信息,无需消费者进行确认操作。
CLIENT_ACKNOWLEDGE:客户端确认机制,从字面上也很容易理解,也就是确认的操作要由消费者主动完成。从代码上来说就是消费者必须调用javax.jms.Message的acknowledge方法发送接收确认。
DUPS_OK_ACKNOWLEDGE:可重复确认,这个机制主要是用在批量确认的场景中。具体执行方式其实和AUTO_ACKNOWLEDGE相似,不需要手动调用方法发送确认。这个机制在我理解看来类似于将多个自动确认的操作放在一次操作上进行。
上述是对机制的简单的介绍,具体的可以百度详细了解。
写完发布者后就是消费者的类了:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class AmqConsumer {
public static void main(String[] args) {
// 连接工厂
ConnectionFactory connectionFactory;
// 连接
Connection connection = null;
// 会话
Session session;
// 消费者
MessageConsumer consumer;
// 消费地址
Destination destination;
// 实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL);
try {
// 从工厂获取连接
connection = connectionFactory.createConnection();
// 启动连接
connection.start();
// 创建session
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建地址
destination = session.createQueue("MyAmq");
// 创建消费者
consumer = session.createConsumer(destination);
while (true) {
TextMessage message = (TextMessage) consumer.receive(10000);
if (message != null) {
System.out.println("接收消息:" + message);
} else {
break;
}
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
两个类都写完后,先运行发布者。可以在监控平台上的Queues菜单中看到发布的消息数量及具体信息:
然后运行消费者的类:
后台会输出接收到的消息信息,然后进入监控平台
因为我没有结束消费者的进程,所以这里可以看到消费者的个数为一。而待消费的消息数量已经清零了,同时已消费的消息数量增加了10个。表明消费成功。