ActiveMQ-inAction-Broker-學習筆記

Running Broker(運行 broker)java

  • ActiveMQ5.0 的二進制發佈包中bin 目錄中包含一個名爲activemq 的腳本,
    • 直接運行這個腳本就能夠啓動一個broker。
  • 此外也能夠經過一下對其進行配置:
    • Broker Configuration URI
    • Broker XBean URI 對broker
  • 如下是一些命令行參數的例子:

Embedded(嵌入的) Brokerweb

  • 能夠經過在應用程序中以編碼的方式啓動broker,例如:
    • Java 代碼
      • BrokerService broker = new BrokerService();
        broker.addConnector("tcp://localhost:61616");
        broker.start();

         

  • 啓動多個broker,那麼須要爲broker 設置一個名字。例如:
    • Java 代碼
      • BrokerService broker = new BrokerService();
         broker.setName("fred");
         broker.addConnector("tcp://localhost:61616");
         broker.start();
    • 若是但願在同一個JVM 內訪問這個broker,
      • 那麼可使用VM Transport,
      • URI是:vm://brokerName。

能夠經過BrokerFactory 來建立broker,例如:apache

  • Java 代碼
    • BrokerService broker = BrokerFactory.createBroker(new URI(someURI));
      someURI 的可選值以下:
  • 當使用XBean 的配置方式的時候,須要指定一個xml 配置文件,例如:
    • Java 代碼
      • BrokerService broker = BrokerFactory.createBroker(new URI("xbean:com/test/activemq.xml"));

         

    • 使用Spring 的配置方式以下:
      • Xml 代碼
        • <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
               <property name="config" value="classpath:org/apache/activemq/xbean/activemq.xml" />
               <property name="start" value="true" />
           </bean>

           

Monitoring Broker(監控broker)json

  • JMX
    • 在使用JMX 監控broker 以前,
      • 首先要啓用broker 的JMX 監控功能,
        • 例如在配置文件中設置useJmx="true",
    • 以下:
      • <broker useJmx="true" brokerName="broker1>
            <managementContext>
                  <managementContext createConnector="true"/>
            </managementContext>
         ...
        </broker>
    • 接下來運行JDK 自帶的jconsole。
    • 在運行了jconsole 後,它會彈出對話框來選擇須要鏈接到的agent。
    • 若是是在啓動broker 的主機上 運行jconsole,
      • 那麼ActiveMQ broker 會出如今jconsole 的Local 標籤中。
    • 若是要鏈接到遠程的broker,
      • 那麼能夠在Advanced 標籤中指定JMX URL,
    • 如下是一個鏈接到本機的JMX URL:
      • service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
    • 在jconsole 的MBeans 標籤中,
      • 能夠查看詳細信息,
      • 也能夠執行相應的operation。
    • 須要注意的是,在jconsole 鏈接到broker 的時候,
      • 並不須要輸入用戶名和密碼,
      • 若是這存在潛在的安全問題,
      • 那麼就須要爲JMX Connector 配置密碼保護(須要使用1.5 以上版本的JDK)。
  • 首先要禁止ActiveMQ 建立本身的connector,例如:
    • Xml 代碼
      • <broker xmlns="http://activemq.org/config/1.0" brokerName="localhost" useJmx="true">
            <managementContext>
               <managementContext createConnector="false"/>
            </managementContext>
         </broker>
  • 而後在ActiveMQ 的conf 目錄下建立一個訪問控制文件和密碼文件,
    • 以下:conf/jmx.access:
      • # The "monitorRole" role has readonly access.
        # The "controlRole" role has readwrite access.
        monitorRole readonly
        controlRole readwrite
        conf/jmx.password:
        # The "monitorRole" role has password "abc123".
        # The "controlRole" role has password "abcd1234".
        monitorRole abc123
        
        controlRole abcd1234

         

  • 而後修改ActiveMQ 的bin 目錄下activemq 的啓動腳本,
    • 查找包含"SUNJMX="的一行以下:
      • REM set SUNJMX=-Dcom.sun.management.jmxremote.port=1616
        -Dcom.sun.management.jmxremote.authenticate=false
        -Dcom.sun.management.jmxremote.ssl=false
      • 把它替換成:
      • set SUNJMX=-Dcom.sun.management.jmxremote.port=1616
        -Dcom.sun.management.jmxremote.authenticate=true
        -Dcom.sun.management.jmxremote.ssl=false
        -Dcom.sun.management.jmxremote.password.file=%ACTIVEMQ_BASE%/conf/jmx.password
        -Dcom.sun.management.jmxremote.access.file=%ACTIVEMQ_BASE%/conf/jmx.access
  • 最後重啓ActiveMQ 和jconsole,這時候須要強制login。
    • 若是在啓動activemq的過程當中出現如下錯誤,
      • 那麼須要爲這個文件增長訪問 控制。

Monitoring Broker安全

  • Web Console
    • Web Console 被集成到了ActiveMQ 的二進制發佈包中,
      • 所以缺省訪問
        • http://localhost:8161/admin
      • 便可訪問Web Console。
    • 在配置文件中,
      • 能夠經過修改nioConnector 的port 屬性
      • 來修改Web console的缺省端口:
        • <jetty xmlns="http://mortbay.com/schemas/jetty/1.0">
             <connectors>
               <nioConnector port="8161" />
             </connectors>
            ...
          </jetty>
    • 出於安全性或者可靠性的考慮,
      • Web Console 能夠被部署到不一樣於ActiveMQ的進程中。
      • 例如把activemq-web-console.war 部署到一個單獨的web 容器中(Tomcat,Jetty 等)。
    • 在ActiveMQ5.0 的二進制發佈包中不包含activemq-web-console.war,
      • 所以須要下載 ActiveMQ 的源碼,
      • 而後進入到${activemq.base}/src/activemq-web-console 目錄中執行mvn instanll。
      • 若是一切正常,
        • 那麼缺省會在${activemq.base}/src/activemq-web-console/target目錄 中生成activemq-web-console-5.0.0.war。
      • 而後將activemq-web-console-5.0.0.war 拷貝到 Tomcat 的webapps 目錄中,並重命名成activemq-web-console.war。
  • 須要注意的是,
    • 要將activemq-all-5.0.0.jar 拷貝到WEB-INF\lib 目錄中(可能還須要拷貝jms.jar)。
    • 還要爲 Tomcat 設置如下五個系統屬性(修改catalina.bat 文件):
      • set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.type="properties"
        set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jms.url="tcp://localhost:61616"
        set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jmx.url="service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"
        set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jmx.role=""
        set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jmx.password=""
      • 若是JMX 沒有配置密碼保護,
        • 那麼webconsole.jmx.role 和webconsole.jmx.password 設置成""便可。
      • 若是 broker 被配置成了Master/Slave 模式,
        • 那麼能夠配置成使用failover transport,
        • 例如:-Dwebconsole.jms.url=failover:(tcp://serverA:61616,tcp://serverB:61616)
    • 順便說一下,因爲webconsole.type 屬性是properties,
      • 所以實際上起做用的Web Console 的配置文件是
        • WEB-INF/ webconsole-properties.xml。
      • 最後啓動被監控的ActiveMQ,
        • 訪問http://localhost:8080 /activemq-web-console/,
        • 查看顯示是否正常。
  • Advisory(諮詢的) Message
    • ActiveMQ 支持Advisory Messages,
      • 它容許你經過標準的JMS 消息來監控系統
    • 目前的Advisory Messages 支持:
      •  consumers, producers and connections starting and stopping
         temporary destinations being created and destroyed
         messages expiring on topics and queues
         brokers sending messages to destinations with no consumers.
         connections starting and stopping
    • Advisory Messages 能夠被想象成某種的管理通道,
      • 經過它你能夠獲得關於JMS provider、producers、consumers 和destinations 的信息。
      • Advisory topics都使用ActiveMQ.Advisory.這個前綴,
    • 如下是目前支持的topics:
      • Client based advisories
      • 在消費者啓動/中止的Advisory Messages 的消息頭中有個consumerCount屬性,
        • 他用來指明目前desination 上活躍的consumer 的數量。
      • Destination and Message based advisories
      • 以上的這些destnations 均可以用來做爲前綴,
        • 在其後面追加其它的重要信息,
        • 例如topic、queue、clientID、 producderID 和consumerID 等。
      • 這令你能夠利用Wildcards 和 Selectors 來過濾Advisory Messages
        • (關於Wildcard和Selector 會在稍後介紹)。
    • 例如,
      • 若是你但願訂閱FOO.BAR 這個queue 上Consumer 的start/stop 的消息,
        • 那麼能夠訂閱 ActiveMQ.Advisory.Consumer.Queue.FOO.BAR;
      • 若是但願訂閱全部queue 上的start/stop 消息,
        • 那麼能夠訂閱ActiveMQ.Advisory.Consumer.Queue.>;
      • 若是但願訂閱全部queue 或者topic上的 start/stop 消息,
        • 那麼能夠訂閱ActiveMQ.Advisory.Consumer. >。
    • org.apache.activemq.advisory.AdvisorySupport 類上有以下的helpermethods,
      • 用來在程序中獲得advisory destination objects。
        • Java 代碼
          • AdvisorySupport.getConsumerAdvisoryTopic()
            AdvisorySupport.getProducerAdvisoryTopic()
            AdvisorySupport.getDestinationAdvisoryTopic()
            AdvisorySupport.getExpiredTopicMessageAdvisoryTopic()
            AdvisorySupport.getExpiredQueueMessageAdvisoryTopic()
            AdvisorySupport.getNoTopicConsumersAdvisoryTopic()
            AdvisorySupport.getNoQueueConsumersAdvisoryTopic()

             

    • 如下是段使用Advisory Messages 的程序代碼:
      • Destination advisoryDestination = AdvisorySupport.getProducerAdvisoryTopic(destination)
        
        	MessageConsumer consumer = session.createConsumer(advisoryDestination);
            consumer.setMessageListener(this);
        
        	// ...
        	public void onMessage(Message msg) {
        		if (msg instanceof ActiveMQMessage) {
        			try {
        				ActiveMQMessage aMsg = (ActiveMQMessage) msg;
        				ProducerInfo prod = (ProducerInfo) aMsg.getDataStructure();
        			} catch (JMSException e) {
        				log.error("Failed to process message: " + msg);
        			}
        		}
        	}
  • Command Agent
    • 在介紹Command Agent 前首先簡要介紹一下XMPP(Jabber)協議,
    • XMPP 是一種基於XML 的即時通訊協議
    • 它由Jabber 軟件基金會開發。
    • 在配置文件中經過增長transportConnector 來支持XMPP 協議:
      • Xml 代碼
        • <broker xmlns="http://activemq.org/config/1.0">
            <transportConnectors>
             ...
                <transportConnector name="xmpp" uri="xmpp://localhost:61222"/>
            </transportConnectors>
          </broker>
    • ActiveMQ 提供了ActiveMQ messages 和XMPP 之間的雙向橋接:
      • 如 果客戶加入了一個聊天室,
        • 那麼這個聊天室的名字會被映射到一個JMS topic。
      •  嘗試在聊天室內發送消息
        • 會致使一個JMS 消息被髮送到這個topic。
      •  呆在一個聊天室中意味着這將保持一個對相應JMS topic 的訂閱。
        • 所以發送到這個topic 的JMS 消息也會被髮送到聊天室。
    • 從4.2 版本起,ActiveMQ 支持Command Agent。
      • 在配置文件中,經過設置commandAgent 來啓用Command Agent:
        • <beans>
             <broker useJmx="true" xmlns="http://activemq.org/config/1.0">
                ...
             </broker>
             <commandAgent xmlns="http://activemq.org/config/1.0"/>
          </beans>
    • 啓用了Command Agent 的broker 上會有一個來自Command Agent 的鏈接,
      • 它同時訂閱topic: ActiveMQ.Agent。
      • 在你啓動XMPP 客戶端,
        • 加入到ActiveMQ.Agent 聊天室後,
        • 就能夠同broker 進行交談了。
      • 經過在XMPP 客戶端中鍵入help,能夠獲得幫助信息。
    • 須要注意的是,
      • ActiveMQ5.0 版本有個小bug,
      • 若是broker 沒有采用缺省的用戶名和密碼,
        • 那麼Command Agent 便沒法正常啓動。
      • Apache 官方文檔說,此bug 已經被修正,預約在5.2.0 版本上體現。
    • 修改方式以下:
      • <commandAgent xmlns="http://activemq.org/config/1.0" brokerUser="user" brokerPassword="passward"/>
  • Visualization plugin
    • ActiveMQ 支持以broker 插件的形式生成DOT 文件(能夠用agrviewer 來查看),
    • 以圖表的方式描述connections、 sessions、producers、consumers、destinations 等信息。
    • 配置方式以下:
      • <broker xmlns="http://activemq.org/config/1.0" brokerName="localhost" useJmx="true">
         ...
          <plugins>
            <connectionDotFilePlugin file="connection.dot"/>
            <destinationDotFilePlugin file="destination.dot"/>
          </plugins>
        </broker>
相關文章
相關標籤/搜索