【问题标题】:ActiveMQ won't restart because KahaDB is lockedActiveMQ 不会重启,因为 KahaDB 被锁定
【发布时间】:2012-09-28 00:26:14
【问题描述】:

在我的开发机器上本地启动/停止 ActiveMQ (5.6) 我只是分别运行 ./activemq start./activemq stop

在我们的 QA 机器上,我们将其作为服务安装并分别运行 service activemq startservice activemq stop

我刚去弹了QA机,发了service activemq stop,然后service activemq start重启了。

我看到一个正在创建的进程 ID,如果我运行 ps -aef | grep activemq,我会看到 ActiveMQ 服务器的活生生的进程。

但是,如果我转到 http://<qa-server>:8161/admin,我会收到您在服务器关闭时看到的典型错误:

Firefox 无法与位于 :8161 的服务器建立连接。

编辑:我现在尝试了 ./active startservice activemq start 方法,都产生了同样的问题:我看到一个进程正在创建,但在 web 管理工具中什么都没有。

我检查了 ActiveMQ 的主目录,没有看到任何类型的 logs/ 目录,所以我什至不确定从哪里开始调试问题。

要么 AMQ 未重新启动,要么其 Web 管理应用程序未重新启动或正常运行;无论哪种方式,我都不知道从哪里开始。提前致谢!

编辑

我在data/activemq.log 中看到以下错误:

2012-10-07 11:37:14,501 |信息 |数据库 /qa-server/kahadb/lock 已锁定...等待 10 秒以使数据库解锁。原因:java.io.IOException:无法锁定文件“/qa-server/kahadb/lock”。 | org.apache.activemq.store.kahadb.MessageDatabase |主要的 2012-10-07 11:37:24,504 |信息 |数据库 /qa-server/kahadb/lock 已锁定...等待 10 秒以使数据库解锁。原因:java.io.IOException:无法锁定文件“/qa-server/kahadb/lock”。 | org.apache.activemq.store.kahadb.MessageDatabase |主要

【问题讨论】:

  • 看起来 AMQ 没有重新启动。停止前和启动后检查PID。还是一样?终止进程。
  • 再次感谢@quartzde - 请在 Bobby Fisher 的回答下方查看我的评论。我验证了启动ActiveMQ后PID存在,停止后验证PID不再存在。此外,我已经验证我没有多个 PID 试图相互竞争,例如多个 AMQ 实例因为我发布的所有启动/停止等而相互竞争。
  • 也许停止没有释放锁。停止 AMQ,清理 data/,启动 AMQ。
  • 谢谢,但是当你说“清理data/ 这让我有点困惑。data/ 是它的日志目录(在这种情况下,为什么擦除日志文件会释放锁)?或者你的意思是“清理data/”是什么意思?再次感谢您迄今为止的所有帮助,再次感谢 +1。
  • 另外,我找到了this 文章,但这对我来说意义不大。我知道我们使用 NFS,所以也许有一个“主”实例之类的?

标签: java jetty activemq restart


【解决方案1】:

原来我们的 QA 环境中有多个 AMQ 服务器。当我关闭第一台服务器时,由于某种原因引发了异常,因此它没有释放锁。拥有该锁然后转到另一个 AMQ 实例(第一个服务器是主服务器,第二个服务器是从服务器)。

当我尝试重新启动第一台服务器(主服务器)时,它不会重新启动,因为第二台服务器拥有锁。我关闭了第二台服务器并释放了锁,允许我重新启动它们。

【讨论】:

    【解决方案2】:

    检查data/ 目录的日志。

    这是一个错字吗? :8161.admin
    试试:8161/admin

    【讨论】:

    • 感谢@quartzde (+1) - 是的,我正要发布从该日志中看到的异常;请参阅原始问题中的更新。再次感谢!
    • 是的,这是一个错字(我会改正的)!
    【解决方案3】:
    1. 转到 Win7 中的 apache 安装主文件夹,即 apache-activemq-X.XX.X
    2. 右键单击并选择属性
    3. 为您的登录用户更改此文件夹的访问权限 - “通常您的登录用户应该已经具有 ADMIN 访问权限,但是如果您在您的机器上解压了这个 apache MQ,那么管理员权限将丢失”

    现在,你应该可以顺利运行 activemq 命令了

    【讨论】:

      【解决方案4】:

      停止服务并不能保证服务已停止。 Windows 跨越线程,并在一定时间后假定服务已停止。如果您仍然看到它在进程列表中运行,请始终检查、验证、终止该进程。这样做可能会清除它持有的锁。

      【讨论】:

      • 感谢@BobbFisher (+1) - 但是我在 之前都检查了ps -aef | grep activemq 的 PID,在关闭服务之后,bobbFisher 方法(service activemq stop 和 ./activemq stop),并在所有场景中验证 PID 不再存在/活着......有什么想法吗?
      • 看起来你在linux环境下工作。对不起我对操作系统的假设。但是,查看您发布的日志,看起来 activemq 正在尝试对数据库进行锁定,但是 Kakadu 库中锁定文件的存在告诉我,其他进程正在对其进行锁定,或者来自activemq 由于某种原因没有被清除。如果您确定没有其他进程在db上持有锁,您可以删除锁文件以便activemq正常启动。
      • 这是完全错误的。一旦您的服务在 OnStop() 或 OnShutdown() 中收到停止信号,即使您的服务陷入无限循环,它也会停止 - 在这种情况下,Windows 会一直等待,直到达到内部超时(可能非常短或很长,最多几十秒)然后杀死它。服务甚至可以请求额外的关闭时间——但我猜因为大多数服务都是由互联网超级英雄创建的,只有少数人真正知道他们应该如何工作。如果您系统上的某项服务实际上没有停止,则表示存在严重缺陷,应将其卸载。
      【解决方案5】:

      如果以上都不适合您的情况,请按照以下更简单的步骤操作:

      1. 转到任务管理器并杀死当前正在运行的所有 java 进程。
      2. 以管理员身份运行activemq批处理文件

      通过在本地浏览器中打开以下内容来验证它是否正常运行:http://localhost:8161/

      【讨论】:

        猜你喜欢
        • 2014-05-18
        • 2016-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多