activeMQ是很是流行的消息中間件,最近在下載完後遇到幾個問題,以爲有必要寫這篇博文做爲記錄整個起手的過程。java
一、下載完activeMQ後,打開bin目錄下的activeMQ.bat,不管怎麼點擊都會閃退?mysql
二、http://localhost:8161/admin 這個地址的用戶名和密碼如何設置?web
一、 後面諮詢了下大佬,才發現問題很低級,就是其實activeMQ在window下跑是會分32位和64位的,個人電腦系統是64位的windows,須要點擊64文件夾下面的activeMQ.bat,ok開啓後控制檯界面是下面這樣的了:sql
二、在 mq安裝目錄/conf/jetty.xml中,開啓權限控制數據庫
同時在/conf/jetty-realm.properties添加用戶apache
解決了上面問題之後就能夠開始開心的玩耍了,首先啓動mq客戶端,而後登錄消息管理頁面,默認是在8161這個端口上,點擊消息代理管理鏈接:windows
會提示你輸入用戶名和密碼,就是上面問題2中設置的:api
輸入之後,就會跳轉到管理頁面,具體能夠自行點擊體驗:session
好比進入消息隊列頁面,能夠看到列表頁有一個名爲FirstQueue的消息隊列,還有該隊列的待消費消息數量,消費消息數量,入列消息數量,出列消息數量等信息。jsp
這邊的操做列還提供了手動發送消息的功能:
點擊發送之後,在開啓的消費端能夠收到下面的消息:
考慮到宕機問題,咱們通常須要對發送的消息進行持久化,
producer = session.createProducer(destination); producer.setDeliveryMode(DeliveryMode.PERSISTENT); //設置消息持久化 sendMsg(session,producer); session.commit();
持久化帶來的好處就是,宕機重啓好,消息不會丟失,宕機前未消費的消息,能夠在重啓後,從新消費。
持久化存放的地址在apache-activemq\conf\activemq.xml在越80行會發現默認的配置項:
<persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter>
上面默認使用的是kahaDB,是一個基於文件支持事務的消息存儲器,是一個可靠,高性能,可擴展的消息存儲器,固然咱們還可使用mysql等數據庫做爲持久化目的地,具體配置(在activeMQ.xml)和web項目中配置數據源如出一轍(須要下載mysql-connector包到activeMQ的lib包下)。
上面說的是點對點方式的持久化,對於訂閱和消費模式,其實也有持久化的問題,持續訂閱和非持續訂閱,是針對「訂閱-發佈」模式的細分處理策略,在JMS規範中的標準稱呼是:Durable-Subscribers和Non-Durable Subscribers。
Durable-Subscribers:是指在「訂閱-發佈」模式下,即便標記爲Durable-Subscribers的訂閱者下線了(多是由於訂閱者宕機,也多是由於這個訂閱者故意下線),「訂閱-發佈」模式的Topic隊列也要保存這些消息(視消息不一樣的持久化策略影響,保存機制不同),直到下次這個被標記爲Durable-Subscribers的訂閱者從新上線,並正確處理這條消息爲止。換句話說,標記爲Durable-Subscribers的訂閱者是否能得到某條消息,和它是否曾經下線沒有任何關係。
Non-Durable Subscribers:是指在「訂閱-發佈」模式下,「訂閱-發佈」模式的Topic隊列不用爲這些已經下線的訂閱者保留消息。當後者將消息按照既定的廣播規則發送給當前在線的訂閱者後,消息就能夠被標記爲「處理完成」。
具體在操做的是以下:
// 建立持久訂閱的時候,必需要設置client,不然會報錯: // 若是clientID重複(已經存在相同id的活動鏈接),會報錯 // javax.jms.InvalidClientIDException: Broker: localhost - Client: 1 // already connected from tcp://127.0.0.1:2758 connection.setClientID("1"); TopicSession session = connection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE); // 在同一個鏈接的ClientID下,持久訂閱者的名稱必須惟一 // javax.jms.JMSException: Durable consumer is in use for client: 1 and // subscriptionName: 11 TopicSubscriber subscriber = session.createDurableSubscriber(topic,"11");
其實activeMQ其實仍是挺簡單的,api也很簡潔,從目前來看activeMQ支持的五種消息類型來講(消息類型JMS規範中的消息類型包括TextMessage、MapMessage、ObjectMessage、BytesMessage、和StreamMessage),可作的事情很是多,能夠多嘗試下,下一篇大概介紹一下activeMQ的應用場景。