ActiveMQ是消息队列的一种,消息队列主要作用是:应用之间的解耦,进行异步通信等。下面的例子主要ActiveMQ(版本是:5.15.11)的入门demo,最好Linux中已经安装了ActiveMQ,没有安装也没有关系。ActiveMQ可以看做是生产者-消费者模型,包括队列和主题两者类型。
1.依赖:maven的pom.xm文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qxf</groupId>
<artifactId>activemq</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.11</version>
</dependency>
</dependencies>
</project>
2. 队列:生产者,详细的信息,写到了代码中
package com.qxf.activemq.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Auther: qiuxinfa
* @Date: 2019/1/2
* @Description: com.qxf.activemq.queue
*/
public class JmsProduce {
// public static final String AVTIVEMQ_URL = "tcp://192.168.231.128:61616"; //linux
public static final String AVTIVEMQ_URL = "tcp://localhost:61616"; //windows本机
public static final String QUEUE_NAME = "queue01";
public static void main(String[] args) throws JMSException {
//1.创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(AVTIVEMQ_URL);
//2.创建连接
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 producer = session.createProducer(queue);
//产生消息
for (int i=1;i<=3;i++){
//6. 产生消息
TextMessage textMessage = session.createTextMessage("msg-->" + i);
//7. 发送消息给mq
producer.send(textMessage);
}
//8. 关闭资源
producer.close();
session.close();
connection.close();
System.out.println("发送消息完成。。");
}
}
3.队列:消费者
package com.qxf.activemq.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Auther: qiuxinfa
* @Date: 2019/1/2
* @Description: com.qxf.activemq.queue
*/
public class JmsConsumer {
//默认用户名和密码admin/admin
// public static final String AVTIVEMQ_URL = "tcp://192.168.231.128:61616"; //Linux
public static final String AVTIVEMQ_URL = "tcp://localhost:61616"; //windows本机
public static final String QUEUE_NAME = "queue01";
public static void main(String[] args) throws Exception{
//1.创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(AVTIVEMQ_URL);
//2.创建连接
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. 创建消费者
MessageConsumer consumer = session.createConsumer(queue);
// //同步阻塞方式
// while (true){
// //6. 接收消息
// //生产的消息类型和接收类型要相同
// TextMessage message = (TextMessage) consumer.receive(5000L); //5秒后停止接收
// if (null != message){
// System.out.println("接收消息-->"+message.getText());
// }else {
// break;
// }
// }
// //7.关闭资源
// consumer.close();
// session.close();
// connection.close();
//使用监听器方式
consumer.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();
}
}
}
});
//7.关闭资源
System.in.read();
consumer.close();
session.close();
connection.close();
}
}
这里说一下,其中消费者之后,消费者会一直监听对应的队列的消息,一有消息就会消费。
4. 主题:发布者,和队列生产者比较像
package com.qxf.activemq.topic;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Auther: qiuxinfa
* @Date: 2019/1/2
* @Description: com.qxf.activemq.queue
*/
public class JmsTopicProduce {
//默认用户名和密码admin/admin
// public static final String AVTIVEMQ_URL = "tcp://192.168.231.128:61616"; //Linux
public static final String AVTIVEMQ_URL = "tcp://localhost:61616"; //windows本机
public static final String TOPIC_NAME = "topic01";
public static void main(String[] args) throws JMSException {
//1.创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(AVTIVEMQ_URL);
//2.创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//3. 创建session会话:事务,签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4. 创建目的地(队列或者主题topic)
Topic topic = session.createTopic(TOPIC_NAME);
//5. 创建消息生产者
MessageProducer producer = session.createProducer(topic);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
//启动连接
connection.start();
//产生消息
for (int i=1;i<=3;i++){
//6. 产生消息
TextMessage textMessage = session.createTextMessage("msg-->" + i);
//7. 发送消息给mq
producer.send(textMessage);
}
//8. 关闭资源
producer.close();
session.close();
connection.close();
System.out.println("发送消息完成。。");
}
}
5.主题:订阅者
package com.qxf.activemq.topic;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Auther: qiuxinfa
* @Date: 2019/12/29
* @Description: com.qxf.activemq.queue
*/
public class JmsTopicConsumer {
//默认用户名和密码admin/admin
// public static final String AVTIVEMQ_URL = "tcp://192.168.231.128:61616"; //Linux
public static final String AVTIVEMQ_URL = "tcp://localhost:61616"; //windows本机
public static final String TOPIC_NAME = "topic01";
public static void main(String[] args) throws Exception{
//1.创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(AVTIVEMQ_URL);
//2.创建连接
Connection connection = activeMQConnectionFactory.createConnection();
connection.setClientID("z3");
//3. 创建session会话:事务,签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4. 创建目的地(队列或者主题topic)
Topic topic = session.createTopic(TOPIC_NAME);
TopicSubscriber subscriber = session.createDurableSubscriber(topic, "备注信息");
//启动连接
connection.start();
Message message = subscriber.receive();
while (null != message){
TextMessage textMessage = (TextMessage)message;
System.out.println("持久化消息-->"+textMessage.getText());
message = subscriber.receive(5000L);
}
//7.关闭资源
session.close();
connection.close();
}
}
主题订阅者要先启动,不然发布者在订阅之前发的消息将无法消费。