ActiveMQ是一个完全支持JMS1.2和JMS1.4规范的JMS provider实现,历史悠久。
什么是JMS
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
JMS的对象模型
| ConnectionFactory | 连接工厂 |
| Connection | 连接 |
| Session | 会话 |
| Destination | 目的 |
| MessageProducer | 生产者 |
| MessageConsumer | 消费者 |
| Message | 消息 |
| Broker | 消息中间件的实例 |
JMS 消息模型
1、Point-to-Poinit 点对点 :一对一,一条消息一个消费
2、Publish/Subscribe (Pub/Sub) /主题 (发布订阅) 一条消息多个消费,类似发布一个事件
ActiveMQ的特性
1、支持多种编程语言 (它只是个服务器,遵循通信协议即可)
2、支持多种传输协议 (多种编解码实现)
3、有多种持久化方式 (文件/数据库)
ActiveMQ安装
下载
ActiveMQ官网 下载最新版本。




我这里用linux版本,安装环境为Centos7 +JDK8
下载后上传至虚拟机解压
解压安装
tar -zxvf apache-activemq-5.15.8-bin.tar.gz
也可以直接在虚拟机用 wget下载
启动停止
服务启动 停止
启动: ./bin/activemq start
停止:./bin/activemq stop
默认端口openwire 61618,在配置文件conf/activemq.xml 里修改

web管理端口在 conf/jetty.xml 里修改。

打开防火墙

•或者直接关闭防火墙: systemctl stop firewalld.service
我用的虚拟机虚拟网络采用nat 方式,所以还要将两个端口给映射出来
浏览器输入http://127.0.0.1:8161/admin/
用户名:密码 admin admin

修改用户名密码
可以在conf/jetty-realm.properties 修改用户名密码

配置系统服务 开机启动
新建service 配置
vi /usr/lib/systemd/system/activemq.service
[Unit]
Description=ActiveMQ service
After=network.target
[Service]
Type=forking
#你的路径
ExecStart=/root/activemq/bin/activemq start
ExecStop=/root/activemq/bin/activemq stop
User=root
Group=root
Restart=always
RestartSec=9
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=activemq
[Install]
WantedBy=multi-user.target
JAVA_HOME 目录配置


注意路径别写错了
通过systemctl管理activemq启停
•启动activemq服务: systemctl start activemq
•查看服务状态: systemctl status activemq

•开机自启: systemctl enable activemq
•检测是否开启成功(enable): systemctl list-unit-files |grep activemq
代码测试
非Spring测试
maven
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.8</version>
</dependency>
</dependencies>
生产者代码
public class Producer {
public static void main(String[] args) {
ActiveMQConnectionFactory connectionFactory;
Connection connection = null;
Session session = null;
try{
//创建连接工厂
connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.1.99:61616");
//创建连接
connection = connectionFactory.createConnection();
connection.start();
// 3、创建会话
// 第一个参数:是否支持事务,如果为true,则会忽略第二个参数,被jms服务器设置为SESSION_TRANSACTED
// 第一个参数为false时,第二个参数的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
// Session.AUTO_ACKNOWLEDGE为自动确认,客户端发送和接收消息不需要做额外的工作。哪怕是接收端发生异常,也会被当作正常发送成功。
// Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的acknowledge方法。jms服务器才会当作发送成功,并删除消息。
// DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。
session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
// 4、创建点对点发送的目标
Destination destination = session.createQueue("queue1");
// 5、创建生产者消息
MessageProducer producer = session.createProducer(destination);
// 设置生产者的模式,有两种可选
// DeliveryMode.PERSISTENT 当activemq关闭的时候,队列数据将会被保存
// DeliveryMode.NON_PERSISTENT 当activemq关闭的时候,队列里面的数据将会被清空
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//設置消息
TextMessage message = session.createTextMessage("hello world!");
//發送消息
producer.send(message);
// session.commit();//如果开启了事物 则需要提交
System.out.println("發送成功");
session.close();
connection.close();
}catch (Exception e){
e.printStackTrace();
}finally {
}
}
消费者代码
public class Consumer {
public static void main(String[] args) {
ConnectionFactory connectionFactory = null;
Connection conn = null;
Session session = null;
try {
connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.1.99:61616");
conn = connectionFactory.createConnection();
conn.start();
session = conn.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("queue1");
MessageConsumer consumer = session.createConsumer(destination);
Message message = consumer.receive();
if(message instanceof TextMessage){
System.out.println("收到文本消息:"+((TextMessage) message).getText());
}else{
System.out.println(message);
}
}catch (JMSException e){
e.printStackTrace();
}finally {
try {
if(session != null){
session.close();
}
if(conn != null){
conn.close();
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
Web控制台查看消息状态

SpringBoot
maven
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent>
<dependencies>
<!--直接使用spring-boot-starter-activemq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
</dependencies>
属性配置
application.properties
spring.activemq.broker-url=tcp://192.168.1.99:61616
spring.activemq.user=admin
spring.activemq.password=admin
生产者代码
@SpringBootApplication
public class Producer {
@Autowired
private JmsTemplate jmsTemplate;
@PostConstruct
public void init() {
jmsTemplate.convertAndSend("queue1", "Hello Spring 4");
}
public static void main(String[] args) {
SpringApplication.run(Producer.class, args);
}
}
消费者代码
@SpringBootApplication
@EnableJms
public class Consumer {
@JmsListener(destination = "queue1")
public void receive(String message) {
System.out.println("收到消息:" + message);
}
public static void main(String[] args) {
SpringApplication.run(Consumer.class, args);
}
}
本文是ActiveMQ的入门教程,首先介绍了JMS(Java消息服务)的概念和对象模型,接着详细讲解了ActiveMQ的特性,包括支持多种编程语言、传输协议和持久化方式。然后,文章详细描述了ActiveMQ在Centos7上的安装过程,包括下载、解压、启动、停止、配置系统服务以及设置开机启动。此外,还提到了如何修改用户名密码和配置JAVA_HOME。最后,提供了非Spring和SpringBoot环境下创建生产者和消费者代码的示例。
301

被折叠的 条评论
为什么被折叠?



