如何在一个系统中运行两个Apache ActiveMQ实例?

时间:2015-05-07 10:55:52

标签: apache activemq

我正在使用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&amp; 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.

请为此数据库锁定问题提供解决方案。

5 个答案:

答案 0 :(得分:5)

制作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服务。

答案 1 :(得分: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下创建多个实例的目的。而且还有更多的tweaky配置。也适用于Kahadb。

答案 2 :(得分:1)

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

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

查看activeMQ.xml中的这一行

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

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

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

希望这有帮助!

祝你好运!

答案 3 :(得分:1)

我确实做过以下指示:

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

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

我对kahadb的{​​{1}}锁定 Windows 5.13.3 和< em> 5.14.5 版本

DZone的同一位作者在他的博客中写了几乎相同的帖子

存在重要更新。

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

bin

set ACTIVEMQ_CONF="ACTIVEMQ_HOME/instanceNumber/conf" set ACTIVEMQ_DATA="ACTIVEMQ_HOME/instanceNumber/data" 表示ACTIVEMQ_HOMEActiveMQ的路径位置的位置是正在编辑的实例,例如:instanceNumberinstanceA

答案 4 :(得分:-1)

虽然由于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

Over&amp;以上通过使用JCA连接器, - 如JBoss,Weblogic,Websphere,Geronimo,Glassfish, - 可以完成ActimeMQ修补作为一种资源适配器。而使用Apache Camel(karaf),JBoss Fuse ESB等产品HA&amp;可以完成ActiveMQ的聚类。