2

我们正在尝试使用自动发现和多播在 Amazon EC2 上的生产环境中设置活动 MQ 集群。我能够在我的本地活动 mq 服务器上使用多播成功配置自动发现,但在 Amazon EC2 上它不起作用。

链接 中我发现 Amazon EC2 不支持多播。因此,我们必须使用 HTTP 传输或 VPN 进行多播。我通过下载activemq-optional-5.6.jar(我们使用Active-MQ 5.6版本)尝试了多播的HTTP传输。它需要 httpcore 和 httpClient jar 来在它的类路径中 servlet。

在代理配置中(activemq.xml)

`
    <网络连接器>
        <networkConnector name="default" uri="http://localhost:8161/activemq/DiscoveryRegistryServlet"/>
    </网络连接器>

    <传输连接器>
        <transportConnector name="activemq" uri="tcp://localhost:61616" discoveryUri="http://localhost:8161/activemq/DiscoveryRegistryServlet"/>
    </transportConnectors>`

被添加。

但是代理没有识别 DiscoveryRegistryServlet。

任何帮助深表感谢。

4

1 回答 1

3

终于弄清楚了如何使用 HTTP 设置主动 MQ 自动发现

Active-MQ 代理配置:

  1. 在 $ACTIVEMQ_HOME/webapps 文件夹中创建一个新文件夹
|_activemq
      |_WEB-INF
             |_类
             |_web.xml

创建一个包含以下内容的 web.xml 文件

    <网络应用>

        <display-name>ActiveMQ Message Broker Web Application</display-name>
        <description>
            Provides an embedded ActiveMQ Message Broker embedded inside a web application
        </description>

        <!-- context config -->
        <context-param>
            <param-name>org.apache.activemq.brokerURL</param-name>
            <param-value>tcp://localhost:61617</param-value>
            <description>The URL that the embedded broker should listen on in addition to HTTP</description>
        </context-param>
        <!-- servlet mappings -->
        <servlet>
            <servlet-name>DiscoveryRegistryServlet</servlet-name>
            <servlet-class>org.apache.activemq.transport.discovery.http.DiscoveryRegistryServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>

        <servlet-mapping>
            <servlet-name>DiscoveryRegistryServlet</servlet-name>
            <url-pattern>/*</url-pattern>
    </servlet-mapping>
    </web-app>
  1. Place httpclient-4.0.3.jar, httpcore-4.3.jar, xstream-1.4.5.jar and activemq-optional-5.6.0.jar in $ACTIVEMQ_HOME/lib directory.

  2. In $ACTIVEMQ_HOME/config directory, modify the jetty.xml file to expose activemq web app.

    <bean id="securityHandler" class="org.eclipse.jetty.security.ConstraintSecurityHandler">
        ...
        <property name="handler">
                <bean id="sec" class="org.eclipse.jetty.server.handler.HandlerCollection">
                    <property name="handlers">
                ...
                ...
                <bean class="org.eclipse.jetty.webapp.WebAppContext">
                                        <property name="contextPath" value="/activemq" />
                                        <property name="resourceBase" value="${activemq.home}/webapps/activemq" />
                                        <property name="logUrlOnStart" value="true" />
                                        <property name="parentLoaderPriority" value="true" />
                    ...
                    ...
                </list>
                    </property>
                </bean>
            </property>
        </bean>
  1. Modify activemq.xml file in $ACTIVEMQ_HOME/conf directory to use http protocol
    <broker name=”brokerName”>
    ...
     <networkConnectors>
          <networkConnector name="default" uri="http://<loadbalancer_IP>:<locadbalancer_Port>/activemq/DiscoveryRegistryServlet?group=test"/>
          <!--<networkConnector name="default-nc" uri="multicast://default"/>-->
           </networkConnectors>

        <transportConnectors>
            <transportConnector name="http" uri="tcp://0.0.0.0:61618" discoveryUri="http://<loadbalancer_IP>:<locadbalancer_Port>/activemq/test"/>
        </transportConnectors>
    ...
    </broker>

make sure that the broker names are unique. “test” in url is the group name of brokers. Client configuration: 1. Keep httpclient-4.0.3.jar, httpcore-4.3.jar, xstream-1.4.5.jar and activemq-optional-5.6.0.jar in classpath of client 2. URL to be use by client

    discovery:(http://<loadbalancer_IP>:<locadbalancer_Port>/activemq/test)connectionTimeout=10000

here “test” is the group name.

于 2013-11-20T12:00:00.450 回答