ActiveMQ安装
官网下载地址:http://activemq.apache.org/
两种版本,项目中一般都不会喜欢用最新或研发中版本,毕竟新东西的都意味着未知的坑等着勇士踩。点击下载按钮,有windows版本和linux版本。
1、下载后解压
2、修改apache-activemq-5.15.11\conf文件目录下的activemq.xml配置文件。
修改以下配置
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
改成:
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://127.0.0.1:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://127.0.0.1:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://127.0.0.1:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://127.0.0.1:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
3、启动activeMQ,使用cmd进入文件目录apache-activemq-5.15.11\bin下,执行命令activemq start
成功:
4、浏览器输入127.0.0.1:8161便可进入web界面,点击Manage ActiveMQ broker可以查看消息推送的状态,默认账号密码为admin,admin
5、进入apache-activemq-5.15.11\data目录下,可以通过文件activemq.log查看日志。
6、创建队列(activeMQ支持两种模型:Queues和topics)
ActiveMQ实例Queues
1)构建maven项目,引入依赖
<?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>MyActiveMq</groupId>
<artifactId>MyActiveMq</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.9.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
</dependencies>
</project>
2)生产者代码
package producer;
import lombok.extern.slf4j.Slf4j;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Description 生产者
*/
@Slf4j
public class ActiveProducer {
private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
public static void main(String[] args) throws JMSException {
// 创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
// 创建连接
Connection connection = activeMQConnectionFactory.createConnection();
// 打开连接
connection.start();
// 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建队列目标,并标识队列名称,消费者根据队列名称接收数据
Destination destination = session.createQueue("myQueue");
// 创建一个生产者
MessageProducer producer = session.createProducer(destination);
// 向队列推送10个文本消息数据
for (int i = 1 ; i <= 10 ; i++){
// 创建文本消息
TextMessage message = session.createTextMessage("第" + i + "个文本消息");
//发送消息
producer.send(message);
//在本地打印消息
System.out.println("已发送的消息:" + message.getText());
}
//关闭连接
connection.close();
}
}
运行效果:
3)消费者代码
package customer;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Description 消费者
*/
public class ActiveCustomer {
private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
public static void main(String[] args) throws JMSException {
// 创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
// 创建连接
Connection connection = activeMQConnectionFactory.createConnection();
// 打开连接
connection.start();
// 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建队列目标,并标识队列名称,消费者根据队列名称接收数据
Destination destination = session.createQueue("myQueue");
// 创建消费者
MessageConsumer consumer = session.createConsumer(destination);
// 创建消费的监听
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费的消息:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
运行效果(消费者一直处于监听状态):
ActiveMQ实例Topics
1)生产者代码
package producer;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Description 生产者
*/
public class ActiveTopicsProducer {
private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
public static void main(String[] args) throws JMSException {
// 创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
// 创建连接
Connection connection = activeMQConnectionFactory.createConnection();
// 打开连接
connection.start();
// 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建队列目标,并标识队列名称,消费者根据队列名称接收数据
Destination destination = session.createTopic("myTopic");
// 创建一个生产者
MessageProducer producer = session.createProducer(destination);
// 向队列推送10个文本消息数据
for (int i = 1 ; i <= 10 ; i++){
// 创建文本消息
TextMessage message = session.createTextMessage("第" + i + "个文本消息");
//发送消息
producer.send(message);
//在本地打印消息
System.out.println("已发送的消息:" + message.getText());
}
//关闭连接
connection.close();
}
}
2)消费者代码
package customer;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Description 消费者
*/
public class ActiveTopicsCustomer {
private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
public static void main(String[] args) throws JMSException {
// 创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
// 创建连接
Connection connection = activeMQConnectionFactory.createConnection();
// 打开连接
connection.start();
// 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建队列目标,并标识队列名称,消费者根据队列名称接收数据
Destination destination = session.createTopic("myTopic");
// 创建消费者
MessageConsumer consumer = session.createConsumer(destination);
// 创建消费的监听
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费的消息:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
Queues与Topics对比
1、依赖性:
Topics:先启动生产者,再启动消费者,会发现消费者是无法接收到生产者之前所生产的数据,只有消费者先启动,再让生产者消费才可以正常接收数据。
Queuse:先启动生产者,再启动消费者,消费者依然可以接受到生产者之前所生产的数据。
2、重复消费性:
Topics:如果启动两个消费者,那么每一个消费者都能完整的接收到生产者生产的数据,即每一条数据都被消费了两次。
Queuse:如果启动两个消费者,队列中的数据会平均的分给每一个消费者消费,且每一条数据只能被消费一次。