4.ActiveMQ

本文介绍了Apache ActiveMQ的基本概念、应用场景、安装步骤,并详细阐述了点对点和发布/订阅两种消息模式的实现,包括连接配置、消息发送与接收的详细过程。

一、ActiveMQ简介、安装

       MQ英文名MessageQueue,中文名即消息队列,干嘛用的呢,说白了就是一个消息的接受和转发的容器,可用于消息推送。

ActiveMQ是由Apache出品的,一款流行的,能力强劲的开源消息中间件。

二、什么情况下使用ActiveMQ?

1.多个项目之间集成

(1) 跨平台

 (2) 多语言

 (3) 多项目

2.降低系统间模块的耦合度,解耦

软件扩展性

3.系统前后端隔离

前后端隔离,屏蔽高安全区

三、安装

1.jdk

2.解压

从webapps可以看出他自带容器,无需关联tomcat、jetty等。

3.启动

cd ${activemq}/bin

日志打印至控制台:./activemq console

静默启动:./activemq start  | status |stop |restart

访问控制台:http://ip:8161/admin    用户名密码:admin/admin

四、ActiveMQ发送、接收消息

1.两种模式

1.1 点对点

大家接收到的消息都不一样,是瓜分的,瓜分消息队列中的数据,也就是,所有消费端合起来的消费的消息集合,就是消息队列中生产者所发布的所有消息。

如果我们下订单,肯定是点对点模式,正常的,我们的消费端有多个,一个订单被一个消费端消费就可以了,然后正常保存到数据库中。

1.2发布者/订阅者

大家接收到的消息是一样的,共享队列中的数据。

比如领导发送10封邮件给3个人,这三个人肯定是共享这10封邮件,使用点对点瓜分这10封邮件显然不合理,所以用发布者/订阅者模式。

2.实现

      依赖

<dependency>

           <groupId>org.apache.activemq</groupId>

           <artifactId>activemq-all</artifactId>

           <version>5.14.5</version>

</dependency>

2.1 点对点

如何实现点对点模式?

首先我们使用的是Maven项目,在项目的POM.xml添加ActiveMQ的依赖,依赖来自Maven的万能网站mvnresitory.com。5.14.5,哪个下载得多,就选哪个。

添加好依赖后,服务发布的时候,创建相应的连接工厂类。

默认我们去连接是不需要用户名和密码的,可以写成null。

连接的url默认是,其中IP是MQ所在服务器的IP。端口号是看源码得来的,不过配置文件中可以改。

然后用工厂类创建连接对象

连接对象启动连接

和我们的服务器交互会有会话的概念,比如我们的MyBatis和数据库交互有会话的概念。

 

创建会话对象

第一个参数为true,参数2给个null,或者其他的随便,因为不生效。

 

假设为false,第二个参数有4个取值。

分别是

:自动提交,我们什么都不管。

:表示由我的客户端来确定,什么时候我们的事务进行提交。比如我们去删除消息,因为消息不能一直存在,得到之后,我们要去删除,删除就可以通过配置这个参数来做。

:支持副本模式,我们支持多个副本,多个客户端来进行确认。

:交给SqlSession对象来管理咱们的事务。

消息发送到哪?通过session创建目的地,比如说咱们要发送的MQ的名称标识,咱们称之为mq-test-01。就是一个字符串,怎么制定都可以。(创建一个消息队列,指定他的名称标识)

发送的消息内容是什么?比如发送一个文本消息。

创建消息对象

通过消息对象指定内容

 

创建发送者

 

发送消息

 

发送完成之后,提交会话(上面创建会话对象时,第一个参数为true,则不用写,因为自动提交)

 

然后关闭连接

 

如果是10个发送者,每个发一条消息,共发送十条消息呢?(留下一个思考,如何发送对象)

 

 

那么如何接受消息?

接受者前面五步和发送者一样,目的地都一样。

 

创建接受消息对象,如果目的地写错了,就接受不到消息

 

通过监听器接受消息

创建多个接受者,看消息是否是瓜分的。

复制粘贴接受者就行。

Producer.java

public class Producer {

   

    private static final String userName = ActiveMQXAConnectionFactory.DEFAULT_USER;

    private static final String password = ActiveMQXAConnectionFactory.DEFAULT_PASSWORD;

    private static final String brokerURL = "tcp://192.168.129.10:61616";

 

    public static void main(String[] args) throws JMSException {

       //1.创建连接工厂类

       ConnectionFactory factory = new ActiveMQXAConnectionFactory(userName, password, brokerURL);

       //2.创建连接

       Connection connection = factory.createConnection();

       //3.启动连接

       connection.start();

      

       //4.创建会话对象session(事务transactedtrue,参数2不生效)

       //acknowledgeMode:

       Session session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);

      

       //5.目的地

       Queue queue = session.createQueue("mq-test-01");

       //7.创建发送者

       MessageProducer producer = session.createProducer(queue);

       for(int i=1;i<=10;i++) {

           //6.消息对象

           TextMessage message = session.createTextMessage();

           message.setText("消息"+i);

           //8.发送消息

           producer.send(message);

       }

       //9.会话提交

//     session.commit();

      

       //10.关闭连接

       connection.close();

    }

}

Consumer1.java

public class Consumer1 {

   

    private static final String userName = ActiveMQXAConnectionFactory.DEFAULT_USER;

    private static final String password = ActiveMQXAConnectionFactory.DEFAULT_PASSWORD;

    private static final String brokerURL = "tcp://192.168.129.10:61616";

 

    public static void main(String[] args) throws JMSException {

       //1.创建连接工厂类

       ConnectionFactory factory = new ActiveMQXAConnectionFactory(userName, password, brokerURL);

       //2.创建连接

       Connection connection = factory.createConnection();

       //3.启动连接

       connection.start();

      

       //4.创建会话对象session(事务transactedtrue,参数2不生效)

       //acknowledgeMode:

       Session session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);

      

       //5.目的地

       Queue queue = session.createQueue("mq-test-01");

      

       //6.接收消息对象

       MessageConsumer consumer = session.createConsumer(queue);

      

       //7.通过监听器接收消息

       consumer.setMessageListener(new MessageListener() {

           public void onMessage(Message message) {

              TextMessage textMessage = (TextMessage)message;

              //获取消息

              try {

                  String msg = textMessage.getText();

                  System.out.println(msg);

              } catch (JMSException e) {

              }

           }

       });

      

    }

}

2.2 发布者/订阅者

前面4步创建会话都一样的。

 

发布者:

目的地改了,不在用queue了,而是用Topic

由于我们需要每一个订阅者都要得到相同的消息,这个消息是不是要存储到我们的MQ里?不能丢了,要进行持久化。这个持久化意味着,当我们的MQ意外宕机,或者说关闭了,这个消息还在,这就是持久化的作用。

订阅者

目的地也改为Topic。

程序启动顺序:先订阅、再发布

<think>首先,用户的问题是:Apache ActiveMQ启动失败,提示找不到数据文件 `/home/cloud_nms/data/env/activemq/db-2.log`。具体错误是:"Could not locate data file /home/cloud_nms/data/env/activemq/db-2.log"。我需要提供解决方案。 回顾系统指令: - 所有行内数学表达式用 `$...$`。 - 独立公式用 `$$...$$` 并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾添加引用标识 `[^n]`。 用户提供了几个引用,我需要参考它们,但用户说这些引用仅供参考,并不是真正的需求。真正的需求是解决文件找不到的错误。 用户提供的引用: - [^1]: 关于启动无报错但没启动成功,可能涉及日志文件或权限问题。 - [^2]: 显示权限不足的错误:"Permission denied",当尝试创建pid文件时。 - [^3]: 提到数据库被锁定,因为服务自动启动。 - [^4]: 启动时"Could not create the Java Virtual Machine."错误,涉及配置文件修改。 - [^5]: 关于安全漏洞修复,涉及Spring集成。 用户的问题特定是关于找不到 `db-2.log` 文件。这个文件看起来是ActiveMQ的数据文件的一部分。错误信息是"Could not locate data file",这可能与KahaDB存储相关,因为ActiveMQ使用KahaDB作为默认持久化存储。 在ActiveMQ中,数据文件如 `db-2.log` 是KahaDB日志文件。如果文件缺失,启动可能失败。 可能的解决方案: 1. **检查文件路径**:确认 `/home/cloud_nms/data/env/activemq/` 目录是否存在。如果不存,需要创建。 2. **所有权和权限**:确保ActiveMQ进程有权限访问该目录。用户引用[^2]提到权限问题("Permission denied"),所以这可能相关。 3. **配置文件**:ActiveMQ的配置文件可能在 `conf/activemq.xml` 中,其中设置了数据目录。用户引用[^4]提到修改 `activemq.xml` 和其他文件。 4. **恢复或重新初始化数据**:如果文件缺失,可能需要恢复备份或重新初始化存储。 5. **日志检查**:用户引用[^1]建议检查日志文件,以获取更多细节。 结构化回答: - 回答必须清晰、逐步解决问题。 - 使用中文。 - 生成相关问题。 - 添加引用标识:我需要基于提供的引用添加引用。用户说“参考站内引用”,所以我应该在回答中引用它们,但基于相关性。 最相关的引用可能是[^2],因为它涉及权限问题。[^4]涉及配置文件修改。[^1]涉及日志检查。 步骤: 1. **确认目录存在**:检查 `/home/cloud_nms/data/env/activemq/` 目录是否存在。如果不存,创建它。 2. **设置权限**:确保目录有正确权限。通常,ActiveMQ运行的用户(如 `activemq`)应该有读写权限。引用[^2]提到权限问题,所以参考它。 3. **检查配置文件**:在 `conf/activemq.xml` 中,查找KahaDB持久化适配器的配置。路径可能被设置在那里;如果不正确,修正它。参考[^4]。 4. **检查日志**:ActiveMQ日志通常在 `data/activemq.log` 或类似位置;查看日志以获取更多错误细节。参考[^1]。 5. **解决方案**:如果文件缺失,可能需要手动创建或重新初始化数据库。但谨慎操作,以免数据丢失。 可能的命令: - `mkdir -p /home/cloud_nms/data/env/activemq/` - `chown -R activemq:activemq /home/cloud_nms/data/env/activemq/` (假设用户是 `activemq`) - `chmod -R 755 /home/cloud_nms/data/env/activemq/` 在配置文件中,确保 `<persistenceAdapter>` 指向正确路径。 例如: ```xml <broker xmlns="http://activemq.apache.org/schema/core"> <persistenceAdapter> <kahaDB directory="/home/cloud_nms/data/env/activemq/kahadb"/> </persistenceAdapter> </broker> ``` 路径中提到了 `db-2.log`,所以在KahaDB目录中,应该有 `db-1.log`, `db-2.log` 等文件。 如果文件缺失,启动时ActiveMQ可能无法恢复。可能需要从备份恢复或删除索引文件让ActiveMQ重建。 安全考虑:用户引用[^5]是关于安全修复的,但可能与当前问题无关,除非涉及配置更改。 生成相关问题:在回答后,添加相关问题部分。 回答结构: - 引言:总结问题。 - 逐步解决方案: 1. 检查目录存在和权限。 2. 检查配置文件。 3. 查看日志。 4. 尝试初始化或恢复。 - 结尾提醒。 添加引用:在相关步骤末尾添加引用标识。例如: - 权限问题参考[^2]。 - 配置文件参考[^4]。 - 日志检查参考[^1]。 确保中文回答。 最终,生成相关问题。 </think>### Apache ActiveMQ启动失败:找不到数据文件 `/home/cloud_nms/data/env/activemq/db-2.log` 的解决方案 您提出的问题是Apache ActiveMQ启动失败,提示“Could not locate data file /home/cloud_nms/data/env/activemq/db-2.log”。这个错误通常发生在ActiveMQ尝试访问KahaDB持久化存储文件时,文件或目录缺失、权限不足或配置错误导致的问题。KahaDB是ActiveMQ的默认持久化引擎,文件如 `db-2.log` 是其日志文件的一部分。下面我将基于ActiveMQ的工作原理和常见修复经验,提供一个逐步的解决方案指南。解决方案优先考虑安全性和数据完整性,建议操作前备份相关目录(如 `/home/cloud_nms/data/env/activemq/`)。 #### 逐步解决方案 1. **检查目录是否存在和创建路径** - `/home/cloud_nms/data/env/activemq/` 是ActiveMQ配置的数据目录。如果目录缺失,ActiveMQ无法创建或定位文件。 - 使用命令检查目录是否存在: ```bash ls -ld /home/cloud_nms/data/env/activemq/ ``` - 如果输出显示“No such file or directory”,则需要手动创建目录: ```bash mkdir -p /home/cloud_nms/data/env/activemq/ ``` - 确保目录路径正确:ActiveMQ的KahaDB默认路径通常在 `data/kahadb` 下,但引用[^4]显示配置文件可能自定义路径,需核对。 - **为什么有效**:缺失目录是此类错误的常见原因,创建路径可让ActiveMQ初始化文件。 2. **设置目录所有权和权限** - ActiveMQ进程(通常以 `activemq` 用户运行)需要读写权限。引用[^2]中的“Permission denied”表明权限问题常见[^2]。 - 检查当前用户和组: ```bash ps -ef | grep activemq # 确认运行用户,通常为activemq或root ``` - 如果ActiveMQ服务用户是 `activemq`,设置所有权: ```bash chown -R activemq:activemq /home/cloud_nms/data/env/activemq/ chmod -R 755 /home/cloud_nms/data/env/activemq/ # 755权限确保读写执行 ``` - 如果服务以root运行(不推荐),改为: ```bash chown -R root:root /home/cloud_nms/data/env/activemq/ ``` - 验证权限: ```bash ls -ld /home/cloud_nms/data/env/activemq/ # 应显示drwxr-xr-x ``` - **注意**:权限错误可能导致文件创建失败,参考引用[^2]的案例[^2]。 3. **检查并修改ActiveMQ配置文件** - 配置文件 `conf/activemq.xml` 中定义了KahaDB路径。错误路径会导致文件定位失败。引用[^4]提到修改配置文件解决类似问题[^4]。 - 编辑配置文件: ```bash vim /path/to/activemq/conf/activemq.xml # 替换为您的ActiveMQ安装路径 ``` - 查找 `<persistenceAdapter>` 部分,确保 `directory` 属性指向正确路径: ```xml <persistenceAdapter> <kahaDB directory="/home/cloud_nms/data/env/activemq/kahadb"/> <!-- 路径必须精确 --> </persistenceAdapter> ``` - 如果路径不一致,修正为 `/home/cloud_nms/data/env/activemq/`(注意:`db-2.log` 文件应在 `kahadb` 子目录下,如 `/home/cloud_nms/data/env/activemq/kahadb/db-2.log`)。确保路径结尾无多余斜杠。 - 保存文件后,重启ActiveMQ: ```bash bin/activemq restart ``` - 如果配置文件损坏,可参考默认配置恢复或从备份还原。 4. **查看日志以诊断深层原因** - ActiveMQ日志提供详细错误信息。引用[^1]强调检查日志文件的重要性[^1]。 - 日志位置通常在 `/path/to/activemq/data/activemq.log` 或 `/var/log/activemq.log`。 - 使用命令查看实时日志: ```bash tail -f /path/to/activemq/data/activemq.log ``` - 查找相关错误,如: - “File not found” 或 “IOException”:确认文件缺失或权限问题。 - “Lock acquire failure”:引用[^3]提到数据库锁定问题,可能需停止冲突服务[^3]。 - 如果日志显示文件损坏,考虑初始化KahaDB: - 备份当前数据目录: ```bash cp -R /home/cloud_nms/data/env/activemq/ /backup/ ``` - 删除损坏文件(谨慎操作): ```bash rm -f /home/cloud_nms/data/env/activemq/kahadb/db-*.log # 删除日志文件让ActiveMQ重建 rm -f /home/cloud_nms/data/env/activemq/kahadb/lock # 移除锁文件 ``` - 重启ActiveMQ:它将重建文件。 5. **尝试恢复或重新初始化** - 如果以上步骤无效,文件可能永久丢失: - 从备份恢复 `db-2.log` 文件。 - 或重新初始化ActiveMQ数据: ```bash bin/activemq purge # 清除持久化数据(慎用,会丢失队列数据) bin/activemq start # 重新启动 ``` - 确保Java环境正常:引用[^4]中“Could not create the Java Virtual Machine”错误提示检查Java配置[^4],运行 `java -version` 验证。 #### 预防措施 - **定期备份**:自动备份 `/home/cloud_nms/data/env/activemq/` 目录。 - **权限管理**:避免以root运行ActiveMQ,使用专用用户(如 `activemq`)。 - **安全更新**:引用[^5]提到ActiveMQ漏洞(如CVE-2023-46604)[^5],确保版本≥5.18.3并更新Spring集成配置。 如果问题持续,请提供完整的ActiveMQ日志输出,以便进一步诊断。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值