什么是ActiveMQ
MQ全称为MessageQueue(消息队列),是一个消息的接收和转发的容器,可用于消息推送。ActiveMQ是Apache提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message Service,即Java消息服务)规范。ActiveMQ是对JMS(Java消息服务)的一个具体实现,除了ActiveMQ以外,还有RabbitMQ、Kafka、Jafka等产品。
ActiveMQ的应用场景
activeMQ的应用主要是3个场景,异步、解耦、削峰。
使用
P2P模式
p2p模式是基于队列。
消息生产者
public class JmsProduce {
public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
public static final String QUEUE_NAME = "queue01";
public static void main(String[] args) throws JMSException {
//1.创建连接工厂,按照给定Url地址,采用默认的用户名和密码
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
//2通过连接工厂,获得连接connection并启动访问
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//3.创建回话session,第一个参数是事务,第二个参数是签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.创建目的地(是队列还是主题(topic))
Queue queue = session.createQueue(QUEUE_NAME);
//5.创建消息的生产者
MessageProducer messageProducer = session.createProducer(queue);
//6.通过使用messageProducer生产3条消息发送到MQ的队列里面
for (int i = 1; i <= 3; i++) {
//7.创建消息
TextMessage textMessage = session.createTextMessage("msg---" + i);
//8.通过messageProducer发送给mq
messageProducer.send(textMessage);
}
//关闭资源
messageProducer.close();
session.close();
connection.close();
System.out.println("消息发送到MQ");
}
}
运行程序以后,在activemq控制台查看可以看到以下信息。
这些信息的意思如下
消息消费者
两种消费方式:
- 同步阻塞方式(receive())
- 订阅者或接受者调用MessageConsumer的receive()方法来接收消息,receive方法在能够接收到消息之前将一直阻塞
- 异步非阻塞方式(监听器onMessage())
- 订阅者或接收者通过MessageConsumer的setMessageListener注册一个消息监听器,当消息到达之后,系统自动调用监听器的onMessage方法。
消息消费者代码
public class JmsConsumer {
public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
public static final String QUEUE_NAME = "queue01";
public static void main(String[] args) throws JMSException, IOException {
//1.创建连接工场,按照给定的Url地址,采用默认的用户名和密码
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
//2.通过连接工场,获得连接connection并启动访问
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//创建会话session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建目的地
Queue queue = session.createQueue(QUEUE_NAME);
//创建消费者
MessageConsumer messageConsumer = session.createConsumer(queue);
/* while (true) {
//循环等待接收消息,消费消息
TextMessage textMessage = (TextMessage) messageConsumer.receive();
System.out.println(textMessage);
if (null != textMessage) {
System.out.println("***消费者接受到消息***:" + textMessage.getText());
} else {
System.out.println("****");
break;
}
}
messageConsumer.close();
session.close();
connection.close();*/
//通过监听的方式来消费消息
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if (null != message && message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费者接收到消息" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
//留出一定时间,让消费者消费消息,不加的话消息没有被消费程序就停止运行了
System.in.read();
//关闭资源
messageConsumer.close();
session.close();
connection.close();
}
}
下面这个图展示的是运行后的结果。这里需要注意的是如果consumer的receive方法的参数为空,这个消费者会一直等待消息,程序不会停止运行,如果带参数的话,就是等待消息一定时间以后停止运行。
发布订阅模式
与上面的
消息生产者
public class JmsProduceTopic {
public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
public static final String TOPIC_NAME = "topic01";
public static void main(String[] args) throws JMSException {
//1.创建连接工厂,按照给定Url地址,采用默认的用户名和密码
ActiveMQConnectionFactory mqConnectionFactory = new ActiveMQConnectionFactory();
//2通过连接工厂,获得连接connection并启动访问
Connection connection = mqConnectionFactory.createConnection();
connection.start();
//3.创建回话session,第一个参数是事务,第二个参数是签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.创建目的地(是队列还是主题(topic))
Topic topic = session.createTopic(TOPIC_NAME);
//5.创建消息的生产者
MessageProducer messageProducer = session.createProducer(topic);
//6.通过使用messageProducer生产3条消息发送到MQ的队列里面
for (int i = 1; i <= 3; i++) {
//7.创建消息
TextMessage textMessage = session.createTextMessage("msg---" + i);
//8.通过messageProducer发送给mq
messageProducer.send(textMessage);
}
//关闭资源
messageProducer.close();
session.close();
connection.close();
System.out.println("消息发送到MQ");
}
}
消息消费者
public class JmsConsumerTopic {
public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
public static final String TOPIC_NAME = "topic01";
public static void main(String[] args) throws JMSException, IOException {
//1.创建连接工厂,按照给定的Url地址,采用默认的用户名和密码
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
//2.通过连接工厂,获得连接connection并启动访问
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//创建会话session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建目的地
Topic topic = session.createTopic(TOPIC_NAME);
//创建消费者
MessageConsumer messageConsumer = session.createConsumer(topic);
//通过监听的方式来消费消息
messageConsumer.setMessageListener(message -> {
System.out.println("执行了");
if (null != message && message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费者接收到消息" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//留出一定时间,让消费者消费消息,不加的话消息没有被消费程序就停止运行了
System.in.read();
//关闭资源
messageConsumer.close();
session.close();
connection.close();
}
}