一、ActiveMQ安装
1.0 JDK安装(略)
1.1 下载并解压
# yum install -y wget
# 下载
wget https://mirrors.tuna.tsinghua.edu.cn/apache//activemq/5.15.12/apache-activemq-5.15.12-bin.tar.gz
# 解压到/var
tar -zxf apache-activemq-5.15.12-bin.tar.gz
# 重命名
mv /var/apache-activemq-5.15.12-bin.tar.gz /var/activemq
1.2 配置ActiveMQ的JDK环境
修改activemq安装目录(/var/activemq/bin/env)下的配置
# JAVA_HOME=""
JAVA_HOME="/usr/local/java/jdk1.8.0_201"
JAVACMD="auto"
1.3 启动与停止
# cd /var/activemq
# 启动
./bin/activemq start
# 停止
./bin/activemq stop
访问服务器对应的8161端口,可以看到activemq的页面(需要开启端口或关闭防火墙):
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
点击管理ActiveMQ示例,默认用户名密码admin/admin:
可以看到ActiveMQ实例的各种详细数据:
1.3 将activeMQ注册为Linux系统服务并开机自动启动
-
停止ActiveMQ服务;
-
创建ActiveMQ的systemd服务文件
vim /usr/lib/systemd/system/activemq.service -
文件内容:
[Unit] Description=Apache ActiveMQ After=network-online.target [Service] Type=forking WorkingDirectory=/var/activemq/bin ExecStart=/var/activemq/bin/activemq start ExecStop=/var/activemq/bin/activemq stop Restart=always User=root Group=root StandardOutput=syslog StandardError=syslog SyslogIdentifier=activemq [Install] WantedBy=multi-user.target -
启动ActiveMQ服务
systemctl start activemq -
查看ActiveMQ服务状态
[root@localhost ~]# systemctl status activemq ● activemq.service - Apache ActiveMQ Loaded: loaded (/usr/lib/systemd/system/activemq.service; disabled; vendor preset: disabled) Active: active (running) since 二 2020-03-31 03:52:13 EDT; 1min 19s ago Process: 17700 ExecStart=/var/activemq/bin/activemq start (code=exited, status=0/SUCCESS) Main PID: 17750 (java) CGroup: /system.slice/activemq.service └─17750 /usr/local/java/jdk1.8.0_201/bin/java -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.confi... 3月 31 03:52:13 localhost.localdomain systemd[1]: Starting Apache ActiveMQ... 3月 31 03:52:13 localhost.localdomain activemq[17700]: INFO: Loading '/var/activemq//bin/env' 3月 31 03:52:13 localhost.localdomain activemq[17700]: INFO: Using java '/usr/local/java/jdk1.8.0_201/bin/java' 3月 31 03:52:13 localhost.localdomain activemq[17700]: INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details 3月 31 03:52:13 localhost.localdomain activemq[17700]: INFO: pidfile created : '/var/activemq//data/activemq.pid' (pid '17750') 3月 31 03:52:13 localhost.localdomain systemd[1]: Started Apache ActiveMQ. Hint: Some lines were ellipsized, use -l to show in full. -
新建软连接,设置服务器开机启动:
ln -s /usr/lib/systemd/system/activemq.service /etc/systemd/system/multi-user.target.wants/activemq.service systemctl enable activemq -
重启服务器后,可以看到,activemq自动启动
# 重启 reboot -h now # 查看ActiveMQ服务状态 systemctl status activemq
二、基础使用
2.1 原生基础使用
这里所谓的原生使用,就是基于maven的activemq依赖,使用producer发送一个消息到activemq实例,然后在用cosumer消费掉该存量消息。
2.1.1 添加maven依赖
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.12</version>
</dependency>
2.1.2 使用生产者发送消息到ActiveMQ Broker
public class MyProducer {
private static String brokerUrl = "tcp://192.168.2.191:61616";
private static String destinationUrl = "my-queue1";
public static void main(String[] args) throws Exception {
ActiveMQConnectionFactory connectionFactory;
Connection conn;
Session session;
try {
// 1、创建连接工厂
connectionFactory = new ActiveMQConnectionFactory(brokerUrl);
// 2、创建连接对象md
conn = connectionFactory.createConnection();
conn.start();
// 3、创建会话
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4、创建点对点发送的目标
Destination destination = session.createQueue(destinationUrl);
// 5、创建生产者消息
MessageProducer producer = session.createProducer(destination);
// 设置生产者的模式,有两种可选 持久化 / 不持久化
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
// 6、创建一条文本消息
String text = "Hello world!";
TextMessage message = session.createTextMessage(text);
// 7、发送消息
producer.send(message);
// 8、 关闭连接
session.close();
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
可以看到,ActiveMQ Broker已接收到一条消息:
2.1.3 使用Consumer消费掉该信息
public class MyConsumer {
private static String brokerUrl = "tcp://192.168.2.191:61616";
private static String destinationUrl = "my-queue1";
public static void main(String[] args) {
ActiveMQConnectionFactory connectionFactory;
Connection conn;
Session session;
MessageConsumer consumer;
try {
// 1、创建连接工厂
connectionFactory = new ActiveMQConnectionFactory(brokerUrl);
// 2、创建连接对象
conn = connectionFactory.createConnection();
conn.start(); // 一定要启动
// 3、创建会话(可以创建一个或者多个session)
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4、创建点对点接收的目标,queue - 点对点
Destination destination = session.createQueue(destinationUrl);
// 5、创建消费者消息
consumer = session.createConsumer(destination);
// 6、接收消息(没有消息就持续等待)
Message message = consumer.receive();
if (message instanceof TextMessage) {
System.out.println("收到文本消息:" + ((TextMessage) message).getText());
} else {
System.out.println(message);
}
consumer.close();
session.close();
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
可以看到,ActiveMQ Broker的消息已被消费掉:
2.2 基于SpringBoot的基础使用
2.2.1 添加maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
2.2.2 配置文件
spring.activemq.broker-url=tcp://192.168.2.191:61616
spring.activemq.user=admin
spring.activemq.password=admin
2.2.3 新建生产者模块启动类
@SpringBootApplication
public class MyProducer {
@Autowired
private JmsTemplate jmsTemplate;
@PostConstruct
public void init() {
jmsTemplate.convertAndSend("my-queue-spring", "Hello Spring!");
}
public static void main(String[] args) {
SpringApplication.run(MyProducer.class, args);
}
}
执行后运行起来可以看到,有一个生产者注册到了ActiveMQ Broker,且消息已发送:
2.2.4 新建消费者模块启动类
执行后运行起来可以看到,有一个消费者注册到了ActiveMQ Broker,且存量消息已被消费: