本地消息隊列:咱們在下載好的activemq文件夾下的config文件夾下,找到activemq.bat文件運行,瀏覽器訪問 http://activemq-host:8161/admin。java
activemq-host是啓動機器的ip地址,8161是activemq的默認端口號,默認用戶名和密碼是admin。會進入一下界面: web
固然,這是本地的消息隊列,訪問,咱們啓動以後也能夠經過jdk自帶的jconsole來監控。這裏重點介紹怎樣遠程監控activemq。apache
遠程監控activemq:這裏涉及到JMX的概念,網上我也搜了不少,我也看的不是很明白,這裏你們知道由Java開發的程序,通常都是jmx來監控就能夠了,固然,activemq也是經過Jmx來監控的。這裏首先咱們來配置一些東西。瀏覽器
1.在你下載activemq文件夾下的config中,找到activemq.xml,在broker節點增長useJmx="true"
服務器
2.在managementContext節點更改爲下面的截圖的樣子(這裏我直接截圖了,增長的東西很少,我就不把能複製的放進來了,本身敲敲,熟悉一下~) app
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"
截圖版: url
4.在Linux上進入${active_home}/bin中執行chmod 655 activemq
用來獲取active的權限,咱們解壓activemq以後,發如今bin的activemq是灰色,不能正常啓動就執行activemq restart
這條命令。執行完這條命令以後,會變成綠色。 線程
而後執行chmod 400 ${activemq_home}/conf/jmx
. 意思是設置當前用戶只讀,其餘用戶沒有權限。rest
接下來在${activemq_home}/bin下執行activemq start
或者activemq restart
,通常在前面加sudo,通常用戶沒權限。 activemq stop來中止或者用ps顯示當前運行的activemq的線程號,而後kill便可。
好了,接下來,咱們來用jdk自帶的jconsole來檢測一下。
默認用戶名:admin
密碼:activemq
這裏有可能出現還遠程不上的狀況:這裏有我嘗試了下有兩種解決辦法
固然,咱們在實際項目中可能不僅僅登陸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才能夠~~~~