JMX遠程監控ActiveMQ設置

本地消息隊列:咱們在下載好的activemq文件夾下的config文件夾下,找到activemq.bat文件運行,瀏覽器訪問 http://activemq-host:8161/admin。java

activemq-host是啓動機器的ip地址,8161是activemq的默認端口號,默認用戶名和密碼是admin。會進入一下界面: imageweb

固然,這是本地的消息隊列,訪問,咱們啓動以後也能夠經過jdk自帶的jconsole來監控。這裏重點介紹怎樣遠程監控activemq。apache

遠程監控activemq:這裏涉及到JMX的概念,網上我也搜了不少,我也看的不是很明白,這裏你們知道由Java開發的程序,通常都是jmx來監控就能夠了,固然,activemq也是經過Jmx來監控的。這裏首先咱們來配置一些東西。瀏覽器

1.在你下載activemq文件夾下的config中,找到activemq.xml,在broker節點增長useJmx="true" image服務器

2.在managementContext節點更改爲下面的截圖的樣子(這裏我直接截圖了,增長的東西很少,我就不把能複製的放進來了,本身敲敲,熟悉一下~) imageapp

3.在你activemq文件夾下的bin找到activemq(${active_home}/bin/activemq),找到下面截圖中出出現的代碼,應該是註釋掉的,解除註釋就好了,我下載的版本是5.13.4,有的沒有下面的代碼,不知道是什麼緣由,這個弄明白以後,會再更新。 代碼版(這個能夠直接粘貼過去):this

ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=11099"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false"

截圖版: imageurl

4.在Linux上進入${active_home}/bin中執行chmod 655 activemq用來獲取active的權限,咱們解壓activemq以後,發如今bin的activemq是灰色,不能正常啓動就執行activemq restart這條命令。執行完這條命令以後,會變成綠色。 image線程

而後執行chmod 400 ${activemq_home}/conf/jmx. 意思是設置當前用戶只讀,其餘用戶沒有權限。rest

接下來在${activemq_home}/bin下執行activemq start或者activemq restart,通常在前面加sudo,通常用戶沒權限。 activemq stop來中止或者用ps顯示當前運行的activemq的線程號,而後kill便可。

好了,接下來,咱們來用jdk自帶的jconsole來檢測一下。 image

默認用戶名:admin
密碼:activemq

這裏有可能出現還遠程不上的狀況:這裏有我嘗試了下有兩種解決辦法

  • 關閉遠程服務器上的防火牆(固然,這個不推薦,容易被黑客攻擊)
  • 修改hosts文件,添加遠程實際的Ip地址

image 固然,咱們在實際項目中可能不僅僅登陸activemq的web console或者jconsole來實現監控,我在項目中就是用java程序來實現跟web console同樣的頁面展現的形式。接下來引用我實際項目中的代碼。

controller

String surl = Constant.MQ_URL;  
  String userName = Constant.MQ_USERNAME;  
  String userPwd = Constant.MQ_USERPWD;  
  Map<String, String[]> env = new HashMap<>();  
  String[] credentials = {userName, userPwd};  
  env.put(JMXConnector.CREDENTIALS, credentials);  
  JMXServiceURL url = new JMXServiceURL(surl);    
  JMXConnector jmxc = JMXConnectorFactory.connect(url, env);  
  // JMXConnector jmxc = JMXConnectorFactory.connect(url, null);    
  MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();    
  ObjectName mbeanName = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker");  
  //MBeanInfo info = mbsc.getMBeanInfo(mbeanName);    
  BrokerViewMBean mbean =(BrokerViewMBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, mbeanName, BrokerViewMBean.class, true);  
  List<MqModel> mqList = new ArrayList<MqModel>();  
  OrganizationService organizationService = (OrganizationService) SpringBeanUtil.getBean("organizationService");  
  for (ObjectName na : mbean.getQueues()) {    
            QueueViewMBean queueBean = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(mbsc, na, QueueViewMBean.class, true);  
        MqModel mq = new MqModel();  
        Organization organ = organizationService.getOrganization(queueBean.getName());  
        if(organ!=null){  
            mq.setName(organ.getOrgName());  
        }else{  
            mq.setName(queueBean.getName());  
                      
        }  
        mq.setQueueSize(queueBean.getQueueSize());  
        mq.setConsumerCount(queueBean.getConsumerCount());  
        mq.setDequeueCount(queueBean.getDequeueCount());  
        mq.setEnqueueCount(queueBean.getEnqueueCount());  
        queueBean.getEnqueueCount();  
        mqList.add(mq);  
          
        }

上面的代碼中獲取實際數據經過queueBean.__來獲取,這裏我用一個model來接收了。下面會引入model的代碼

Constant:

public static final String MQ_URL = properties.getProperty("mq.url");//獲取mq遠程連接地址   
  public static final String MQ_USERNAME = properties.getProperty("mq.userName");//mq用戶名   
  public static final String MQ_USERPWD = properties.getProperty("mq.userPwd");//mq密碼

Model:

/** 
 * 這裏自定義一個Model來接收隊列的信息 
 * @author LY 
 * @date 2016-08-10 11:11 
 */  
public class MqModel {  
    private String name;//隊列的名稱  
    private Long queueSize;//隊列中剩餘的消息數  
    private Long consumerCount;//消費者數  
    private Long enqueueCount;//進入隊列的總數量  
    private Long dequeueCount;//出隊列的數量  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public Long getQueueSize() {  
        return queueSize;  
    }  
  
    public void setQueueSize(Long queueSize) {  
        this.queueSize = queueSize;  
    }  
  
    public Long getConsumerCount() {  
        return consumerCount;  
    }  
  
    public void setConsumerCount(Long consumerCount) {  
        this.consumerCount = consumerCount;  
    }  
  
    public Long getDequeueCount() {  
        return dequeueCount;  
    }  
  
    public void setDequeueCount(Long dequeueCount) {  
        this.dequeueCount = dequeueCount;  
    }  
  
    public Long getEnqueueCount() {  
        return enqueueCount;  
    }  
  
    public void setEnqueueCount(Long enqueueCount) {  
        this.enqueueCount = enqueueCount;  
    }  
  
}

application.properties:

#消息隊列服務配置  
my.url = service:jmx:rmi:///jndi/rmi://198.9.4.167:11099/jmxrmi
mq.userName = admin  
mq.userPwd = activemq

最後,說下我遇到的問題: 在剛接到這個需求的時候,我搜了不少,把activemq的遠程配置第一步完成以後,發現用代碼在java程序中控制檯老是報權限的錯誤,不知道爲何,配置也配置好了,後來在stackoverflow看到其餘程序猿也遇到這個問題,我看他們怎麼實現,修改了下個人代碼,就能夠了。controller註釋的部分是我之前的代碼。

Map<String, String[]> env = new HashMap<>();  
String[] credentials = {userName, userPwd};  
env.put(JMXConnector.CREDENTIALS, credentials);

我發現必須把activemq遠程的用戶名和密碼放在map才能夠~~~~

相關文章
相關標籤/搜索