【问题标题】:How to run two instances of Apache ActiveMQ in one system?如何在一个系统中运行两个 Apache ActiveMQ 实例?
【发布时间】:2015-07-17 21:47:45
【问题描述】:

我使用的是 apache-activemq-5.11.1,它是在 JDK 7(主版本 51.0)上运行的稳定版本,我使用的是 JDK 7 Update 80。如果我在 JDK 6 上运行相同版本,则会出现错误。

线程“main”中的异常 java.lang.UnsupportedClassVersionError: org/apache/ac tivemq/console/Main : 不支持的 major.minor 版本 51.0

谈到我的问题,我需要在我的系统中有两个正在运行的 ActiveMQ 实例。我按照以下步骤创建了两个实例。

C:\>cd \apache-activemq-5.11.1
C:\apache-activemq-5.11.1>.\bin\activemq create instance1
C:\apache-activemq-5.11.1>.\bin\activemq create instance2

我已更改为 instance2 的不同端口号集,如下所示,

<!--EDITED: apache-activemq-5.11.1\instance2\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:61716?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="amqp" uri="amqp://0.0.0.0:5772?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61713?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1983?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="ws" uri="ws://0.0.0.0:61714?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>

现在我开始 instance1 & instance2 如下.....

C:\apache-activemq-5.11.1\instance1\bin>instance1 start
C:\apache-activemq-5.11.1\instance1\bin>instance2 start

其中,我尝试启动的第二个实例给出了以下 kahadb 锁定问题.....

 INFO | Refreshing org.apache.activemq.xbean.XBeanBrokerFactory$1@7209d9af: startup date [Thu May 07 16:16:23 IST 2015]; root of context hierarchy
 INFO | PListStore:[C:\apache-activemq-5.11.1\data\localhost\tmp_storage] started
 INFO | Using Persistence Adapter: KahaDBPersistenceAdapter[C:\apache-activemq-5.11.1\data\kahadb]
 INFO | Database C:\apache-activemq-5.11.1\data\kahadb\lock is locked... waiting 10 seconds for the database to be unlocked. Reason: java.io.IOException: File 'C:\apache-activemq-5.11.1\data\kahadb\lock' could not be locked.

请给出这个数据库锁问题的解决方案。

【问题讨论】:

    标签: apache activemq


    【解决方案1】:

    复制您的 ActiveMQ,例如 apache-activemq-x.xx.xapache-activemq-x.xx.x_2

    更改apache-activemq-x.xx.x_2\conf\activemq.xml的端口。确保您要更改的端口号没有冲突。

    <!--EDIT: apache-activemq-5.11.1_2\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:61716?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="amqp" uri="amqp://0.0.0.0:5772?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61713?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1983?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="ws" uri="ws://0.0.0.0:61714?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    

    除了端口更改,我们还必须更正 jetty.xml http 管理控制台端口。

    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
             <!-- the default port number for the web console -->
        <property name="host" value="0.0.0.0"/>
        <property name="port" value="8162"/>
    </bean>
    

    这样就可以在一个系统中运行ActiveMQ的两个服务了。

    【讨论】:

    • 嗨,我正在尝试在 ActiveMQ-5.14.1 中做同样的事情。我对配置进行了所有更改,但我收到稍后启动的实例的“java.lang.IllegalStateException: LifecycleProcessor not initialized”错误。我在这里错过了什么?
    • 如果端口不冲突,问题可能与您所说的 java.lang.IllegalStateException: LifecycleProcessor not initialized 不同,这里这个问题讨论了不同的主题,您可以将相关信息作为另一个主题发布您的问题。但是,如果可以的话,让我看看我的疏忽。那么,您可以重新检查实例之间的端口。就我而言,我只留下了jetty
    • 我真的很抱歉,这只是因为端口。我非常仔细地查看了日志并发现了问题。 tysm
    • 好的,如果你愿意,你仍然可以发布问题并回答自己,这个特定错误是在哪个端口冲突上出现的,比如openwire 左右。
    • 感谢您提供的文档,它几乎对我有用。在运行bin\win64\InstallService.bat 脚本时,我看到了一个额外的错误服务已经存在。解决方法是更改​​bin\win64\wrapper.conf 中的服务名称(同样适用于win32 安装)。查找wrapper.ntservice.name=ActiveMQwrapper.ntservice.displayname=ActiveMQ,并将值更改为其他值。
    【解决方案2】:

    运行为 ActiveMQ 创建的更多实例会提供故障转移选项。

    当一个实例由于某种原因宕机时。另一个实例自动出现,因为锁定 KahaDB 的第一个实例已被释放。

    因为我们正在为故障转移模式配置实例,所以不能更改此端口。

    C:\>cd \apache-activemq-5.11.1
    C:\apache-activemq-5.11.1>.\bin\activemq create instance1
    C:\apache-activemq-5.11.1>.\bin\activemq create instance2
    

    请在不更改任何配置的情况下启动实例。因此,当 instance1 因任何原因出现故障时,instance2 就会出现。

    C:\apache-activemq-5.11.1\instance1\bin>instance1 start
    C:\apache-activemq-5.11.1\instance2\bin>instance2 start
    

    我希望这一定是在ActiveMQ下创建多个实例的目的。不仅如此,还有一些更微妙的配置。也可用于 Kahadb。

    【讨论】:

    • Windows 担心我能够在 dos-prompt 中执行此操作。但未能在 Redhat Linux 中运行并行实例,希望在其他基于 UNIX 的机器上也一样。我试过apache-activemq-5.11.1
    【解决方案3】:

    我确实按照以下说明进行了操作:

    它适用于Mac(未在Linux 中测试)

    注意:实例必须通过instanceNumber start 启动(console 参数/参数不再有效)。

    我对@9​​87654326@ 锁定 WindowsActiveMQ 5.13.35.14.5 版本

    来自 DZone 的同一作者几乎在他的博客中写了同一篇文章

    但是有一个重要的更新。

    您必须为每个 bin 目录中的每个实例打开每个 instanceNumber.bat 文件并添加以下两行:

    set ACTIVEMQ_CONF="ACTIVEMQ_HOME/instanceNumber/conf"
    set ACTIVEMQ_DATA="ACTIVEMQ_HOME/instanceNumber/data"
    

    其中ACTIVEMQ_HOME代表你的ActiveMQ的路径位置,instanceNumber是正在编辑的实例如:instanceAinstanceB

    【讨论】:

      【解决方案4】:

      发生的情况是您已正确更改端口号,但您创建的两个实例使用相同的数据库(在本例中为文件系统 KahaDB)来存储它们的消息,

      因此,当一个实例启动并运行时,它持有该数据库的锁,而 activeMQ 的其他实例将等待获得该数据库的锁。 本质上,这正在成为主从配置。

      查看activeMQ.xml中的这一行

      <persistenceAdapter>
            <kahaDB directory="${activemq.data}/kahadb"/>
      </persistenceAdapter>
      

      这将指向两个实例的相同位置。

      我的解决方案是将整个文件夹 apache-activemq-x.xx.x 复制到不同的位置更改第二个实例的端口号并以不同的方式运行它们 这样,您将在同一台机器上运行 2 个 activeMQ 实例

      希望这会有所帮助!

      祝你好运!

      【讨论】:

      • 我跨驱动器制作了 activemq 的副本。那时两个实例都在寻找 C: drive kahadb。如果我在apache-activemq-x.xx.xapache-activemq-x.xx.x_2 等相同的驱动器下创建它,但是_2 的方式不仅仅是启动实例。在这里,我没有忘记在两种情况下都更改端口号。
      • 在windows中我们可以为activemq创建多个实例,由于文件锁定,我们不能运行创建的实例。 Apache 没有考虑在同一系统的 Windows 环境中运行多个实例。 Apache 在跨系统运行和在 NFS 上共享 kahadb 时谈到了 ActiveMQ 的主从模式。我觉得 Apache 应该考虑为每个在 ActiveMQ 框架下创建的实例创建单独的 kahadb。
      • @DevAnandSadasivam 有任何错误日志或我们可以查看的内容吗?关于你的第一条评论,你为什么不给 kahadb 一个不同的目录给 activeMQ 实例,比如&lt;kahaDB directory="C:/instance1/kahadb"/&gt; 和其他实例&lt;kahaDB directory="C:/instance2/kahadb"/&gt; 你可以试试这个,也许这可行
      • 不是我说的那样。如果我们制作像apache-activemq-x.xx.x_2' '~\conf\activemq.xml 这样的副本,则只需要变量${activemq.data} 的相对路径。除了端口更改,我们还必须更正 jetty.xml http 管理控制台端口。那么它就像你说的那样工作。 &lt;bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"&gt; &lt;!-- the default port number for the web console --&gt; &lt;property name="host" value="0.0.0.0"/&gt; &lt;property name="port" value="816_"/&gt; &lt;/bean&gt;
      • 是的!我错过了关于码头的观点,很高兴你指出了这一点,那么它现在可以正常工作了吗?你还有什么问题吗?
      【解决方案5】:

      虽然由于KahaDB 限制负载平衡/容错配置受到限制。我们可以使用以下类型的连接 URL 来利用 ActiveMQ 负载....

      failover://(tcp://192.nnn.nn.nn:61616,tcp://192.nnn.nn.nn:61616)?randomize=false
      

      randomize=true 将在主动模式下的两个 AciveMQ 之间进行消息洗牌,而不是仅仅通过 ActiveMQ 的故障转移......

      可以在以下 Apache 站点链接下找到完整的参考资料......

      http://activemq.apache.org/failover-transport-reference.html

      但高可用性(即集群)配置仍然使您的应用程序稳定,尽管 Apache 必须提高 ActiveMQ 高可用性,因此事情可以更顺利地工作。

      当前的 Apache ActiveMQ 高可用性配置可在以下链接中找到。

      http://activemq.apache.org/clustering.html

      虽然KahaDB 有文件锁定限制,但可以进行以下调整/替代配置方式...

      1) 共享文件系统主从,- 一个共享文件系统,如 SAN http://activemq.apache.org/shared-file-system-master-slave.html

      2)JDBC Master Slave,- 共享数据库 http://activemq.apache.org/jdbc-master-slave.html

      3) 复制的 LevelDB 存储,- ZooKeeper 服务器 http://activemq.apache.org/replicated-leveldb-store.html

      通过拥有 JCA 连接器,- 像 JBoss、Weblogic、Websphere、Geronimo、Glassfish 之类的 AS,- 可以将 ActimeMQ 修补作为一种资源适配器。并且使用 Apache Camel (karaf),可以完成 JBoss Fuse ESB 类产品 HA 和 ActiveMQ 集群。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-11
        • 2020-09-26
        • 2015-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        相关资源
        最近更新 更多