目录
1.导入依赖
首先导入maven依赖,也可以直接导入jar包
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.13.0</version>
</dependency>
2.发收Queue消息
一个生产者和一个消费者一一对应
2.1消息生产者
生产者发送消息
package com.activemq.queue;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;
public class QueueProducer {
//生产者发送消息
@Test
public void send() throws Exception{
//1.创建一个连接工厂 connectionfactory
//参数:就是要连接的服务器的地址
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.15.133:61616");
//2.通过工厂获取连接对象 创建连接
Connection connection = factory.createConnection();
//3.开启连接
connection.start();
//4.创建一个session对象 提供发送消息等方法
//第一个参数:表示是否开启分布式事务(JTA) 一般是false 不开启。
//第二个参数:就是设置消息的应答模式 如果 第一个参数为false时,第二个参数设置才有意义。用的是自动应答
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建目的地 (destination) queue
//参数:目的地的名称
Queue queue = session.createQueue("queue-test");
//6.创建个生产者
MessageProducer producer = session.createProducer(queue);
//7.构建消息的内容
TextMessage textMessage = session.createTextMessage("queue测试发送的消息");
//8.发送消息
producer.send(textMessage);
//9.关闭资源
producer.close();
session.close();
connection.close();
}
}
我们运行上面的测试方法,执行成功后,我们到activemq的后台管理系统,点击"Queues",可以看到我们刚才发送的那条消息"test-queue"。我们点击"test-queue"
我们会看到如下图所示界面,可以看到刚才发送的那条消息的ID信息,Persistence(持久化)为永久保存,Priorty(优先级)为4,Redelivered(是否重复投递消息)为false,即不重复投递消息。我们点击ID那一长串字符串。
如果出现错误一定要注意jdk版本与activeMQ版本是否对应(版本对应查看)
我们在"Message Details"一栏,可以看到我们发送的消息信息。
2.2消息消费者
消费者接收消息,接收消息有两种方式一种是手动写循环接收消息,一种是使用监听器帮我们接收消息。
package com.activemq.queue;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;
public class QueueCustomer {
@Test
public void recieve() throws Exception {
//1.创建连接的工厂
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.133:61616");
//2.创建连接
Connection connection = factory.createConnection();
//3.开启连接
connection.start();
//4.创建session
//第一个参数:表示是否开启分布式事务(JTA) 一般是false 不开启。
//第二个参数:就是设置消息的应答模式 如果 第一个参数为false时,第二个参数设置才有意义。用的是自动应答
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建接收消息的一个目的地
Queue queue = session.createQueue("queue-test");
//6.创建消费者
MessageConsumer consumer = session.createConsumer(queue);
//7.接收消息 打印
//第一种
/*while(true){
Message message = consumer.receive(1000000);//设置接收消息的超时时间
//没有接收到消息就跳出循环
if(message==null){
break;
}
if(message instanceof TextMessage){
TextMessage message2 = (TextMessage) message;
System.out.println("接收的消息为"+message2.getText());
}
}*/
//第二种
//设置一个监听器
//System.out.println("start");
//这里其实开辟了一个新的线程
consumer.setMessageListener(new MessageListener() {
//当有消息的时候会执行以下的逻辑
@Override
public void onMessage(Message message) {
if(message instanceof TextMessage){
TextMessage message2 = (TextMessage) message;
try {
System.out.println("接收的消息为:"+message2.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
//System.out.println("end");
Thread.sleep(199999);
//8.关闭资源
consumer.close();
session.close();
connection.close();
}
}
可以接收到刚才发的消息。
再来看下activemq的管理后台,点击"Queues",可以看到如下图所示界面。说明我们面对面发送消息是没问题的。
3.发收Topic消息
一个生产者产生消息并进行发送后,可以由多个消费者进行接收。
3.1消息生成者
package com.activemq.topic;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;
public class TopicProducer {
// 发送topic
@Test
public void send() throws Exception {
//1.创建连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.133:61616");
//2.创建连接
Connection connection = factory.createConnection();
//3.开启连接
connection.start();
//4.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建目的地 topic
Topic createTopic = session.createTopic("topic-test");
//6.创建生成者
MessageProducer producer = session.createProducer(createTopic);
//7.构建消息对象
TextMessage createTextMessage = session.createTextMessage("topic发送的消息123");
//8.发送消息
producer.send(createTextMessage);
//9.关闭资源
producer.close();
session.close();
connection.close();
}
}
运行上面的测试方法,运行成功后,我们访问activemq的管理后台页面,点击"Topics",可以看到有"test-topic"这一行,压入消息队列一条消息,但由于没有消费者,因此没有消费掉该消息。
我们点击上图的"test-topic",会看到如下图所示界面。我们发现刚才我们发送的消息并没有被保存。
3.2消息消费者
我们创建两个消费者
package com.activemq.topic;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;
public class TopicCustomer1 {
@Test
public void reieve() throws Exception {
// 1.创建连接的工厂 指定MQ服务器的地址
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.133:61616");
// 2.获取连接
Connection connection = connectionFactory.createConnection();
// 3.开启连接
connection.start();
// 4.根据连接对象创建session (提供了操作activmq的方法)
// 第一个参数:表示是否开启分布式事务(JTA) 一般就是false :表示不开启。 只有设置了false ,第二个参数才有意义。
// 第二个参数:表示设置应答模式 自动应答和手动应答 。使用的是自动应答
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5.根据session创建目的地(destination)
Topic topic = session.createTopic("topic-test");
// 6.创建消费者;
MessageConsumer consumer = session.createConsumer(topic);
// 7.接收消息
// 第一种接收消息.直接接收 只是测试的使用
/*
* while(true){ //设置接收消息的超时时间 单位是毫秒 Message receive =
* consumer.receive(3000000);
*
* if(receive==null){ break; }
*
* //取消息 if(receive instanceof TextMessage){ TextMessage message =
* (TextMessage)receive; String text = message.getText();//获取消息的内容
* System.out.println(text); } }
*/
// 第二种接收消息.设置一个监听器 就是开启了一个新的线程
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if (message instanceof TextMessage) {
TextMessage message2 = (TextMessage) message;
String text = "";
try {
text = message2.getText();
} catch (JMSException e) {
e.printStackTrace();
} // 获取消息的内容
System.out.println(text);
}
System.out.println();
}
});
// 睡眠
Thread.sleep(10000000);
// 9.关闭资源
consumer.close();
session.close();
connection.close();
}
}
我们运行其中一个消费者,会发现,接收不到消息。因为Topic消息,一发送出去,默认不会存储,只要没有人接收,消息就丢了。
需要先运行消费者的监听器,然后生产者发送消息,消费者才会接收到消息。
4.总结
queue 是点对点模式,只能是一个生产者产生一个消息,被一个消费者消费。
topic 是发布订阅模式,一个生产者可以一个消息,可以被多个消费者消费。
queue 默认是存在于MQ的服务器中的,发送消息之后,消费者随时取。但是一定是一个消费者取,消费完消息也就没有了。
topic 默认是不存在于MQ服务器中的,一旦发送之后,如果没有订阅,消息则丢失。
如果想要持久化topic消息
修改activeMQ/conf/activemq.xml文件,在<broker的末尾添加一句关于持久化的配置persistent="true"