ActiveMQ(windows)簡(jiǎn)單實(shí)例

一、消息隊(duì)列(MQ)概述

消息隊(duì)列(Message Queue)寇损,是分布式系統(tǒng)中重要的組件凸郑,其通用的使用場(chǎng)景可以簡(jiǎn)單地描述為:

當(dāng)不需要立即獲得結(jié)果,但是并發(fā)量又需要進(jìn)行控制的時(shí)候矛市,差不多就是需要使用消息隊(duì)列的時(shí)候芙沥。

消息隊(duì)列主要解決了應(yīng)用耦合、異步處理尘盼、流量削鋒等問(wèn)題憨愉。

當(dāng)前使用較多的消息隊(duì)列有RabbitMQ、RocketMQ卿捎、ActiveMQ配紫、Kafka、ZeroMQ午阵、MetaMq等躺孝,而部分?jǐn)?shù)據(jù)庫(kù)如Redis、Mysql以及phxsql也可實(shí)現(xiàn)消息隊(duì)列的功能底桂。

二 植袍、ActiveMQ

有那么多得消息隊(duì)列,各有各的有優(yōu)缺點(diǎn)籽懦,今天主要來(lái)聊聊ActiveMQ

ActiveMQ是由Apache出品于个,ActiveMQ 是一個(gè)完全支持JMS1.1和J2EE 1.4規(guī)范的 JMS Provider實(shí)現(xiàn)。它非衬核常快速厅篓,支持多種語(yǔ)言的客戶端和協(xié)議秀存,而且可以非常容易的嵌入到企業(yè)的應(yīng)用環(huán)境中,并有許多高級(jí)功能羽氮。

主要特性:

服從 JMS 規(guī)范:JMS 規(guī)范提供了良好的標(biāo)準(zhǔn)和保證或链,包括:同步或異步的消息分發(fā),一次和僅一次的消息分發(fā)档押,消息接收和訂閱等等澳盐。遵從 JMS 規(guī)范的好處在于,不論使用什么 JMS 實(shí)現(xiàn)提供者令宿,這些基礎(chǔ)特性都是可用的叼耙;

連接性:ActiveMQ 提供了廣泛的連接選項(xiàng),支持的協(xié)議有:HTTP/S粒没,IP 多播旬蟋,SSL,STOMP革娄,TCP,UDP冕碟,XMPP等等拦惋。對(duì)眾多協(xié)議的支持讓 ActiveMQ 擁有了很好的靈活性。

支持的協(xié)議種類(lèi)多:OpenWire安寺、STOMP厕妖、REST、XMPP挑庶、AMQP 言秸;

持久化插件和安全插件:ActiveMQ 提供了多種持久化選擇。而且迎捺,ActiveMQ 的安全性也可以完全依據(jù)用戶需求進(jìn)行自定義鑒權(quán)和授權(quán)举畸;

支持的客戶端語(yǔ)言種類(lèi)多:除了 Java 之外,還有:C/C++凳枝,.NET抄沮,Perl,PHP岖瑰,Python叛买,Ruby;

代理集群:多個(gè) ActiveMQ 代理可以組成一個(gè)集群來(lái)提供服務(wù)蹋订;

異常簡(jiǎn)單的管理:ActiveMQ 是以開(kāi)發(fā)者思維被設(shè)計(jì)的率挣。所以,它并不需要專(zhuān)門(mén)的管理員露戒,因?yàn)樗峁┝撕?jiǎn)單又使用的管理特性椒功。有很多中方法可以監(jiān)控 ActiveMQ 不同層面的數(shù)據(jù)捶箱,包括使用在 JConsole 或者 ActiveMQ 的Web Console 中使用 JMX,通過(guò)處理 JMX 的告警消息蛾茉,通過(guò)使用命令行腳本讼呢,甚至可以通過(guò)監(jiān)控各種類(lèi)型的日志。

使用ActiveMQ需要:

Java JDK

ActiveMQ安裝包

ActiveMQ可以運(yùn)行在Java語(yǔ)言所支持的平臺(tái)之上谦炬。

優(yōu)點(diǎn):

跨平臺(tái)(JAVA編寫(xiě)與平臺(tái)無(wú)關(guān)有悦屏,ActiveMQ幾乎可以運(yùn)行在任何的JVM上)

可以用JDBC:可以將數(shù)據(jù)持久化到數(shù)據(jù)庫(kù)。雖然使用JDBC會(huì)降低ActiveMQ的性能键思,但是數(shù)據(jù)庫(kù)一直都是開(kāi)發(fā)人員最熟悉的存儲(chǔ)介質(zhì)础爬。將消息存到數(shù)據(jù)庫(kù),看得見(jiàn)摸得著吼鳞。而且公司有專(zhuān)門(mén)的DBA去對(duì)數(shù)據(jù)庫(kù)進(jìn)行調(diào)優(yōu)看蚜,主從分離;

支持JMS :支持JMS的統(tǒng)一接口;

支持自動(dòng)重連赔桌;

有安全機(jī)制:支持基于shiro供炎,jaas等多種安全配置機(jī)制,可以對(duì)Queue/Topic進(jìn)行認(rèn)證和授權(quán)疾党。

監(jiān)控完善:擁有完善的監(jiān)控音诫,包括Web Console,JMX雪位,Shell命令行竭钝,Jolokia的REST API;

界面友善:提供的Web Console可以滿足大部分情況雹洗,還有很多第三方的組件可以使用香罐,如hawtio;

缺點(diǎn):

社區(qū)活躍度不及RabbitMQ高时肿;

根據(jù)其他用戶反饋庇茫,會(huì)出莫名其妙的問(wèn)題,會(huì)丟失消息螃成;

目前重心放到activemq6.0產(chǎn)品-apollo港令,對(duì)5.x的維護(hù)較少;

不適合用于上千個(gè)隊(duì)列的應(yīng)用場(chǎng)景锈颗;

三顷霹、具體實(shí)例

首先我們?nèi)ス倬W(wǎng)下載MQ,官網(wǎng)地址:http://activemq.apache.org/,我目前下載的是5.8.0版本的,下載好后直接雙擊activemq.bat啟動(dòng)


啟動(dòng)成功后击吱,輸入默認(rèn)的訪問(wèn)地址:http://localhost:8161/admin/index.jsp

用戶名:admin? 密碼:admin

用戶名密碼設(shè)置具體配置文件在conf下jetty-realm.properties里面淋淀,jetty.xml文件修改端口號(hào)。



?然后點(diǎn)擊隊(duì)列(Queues)覆醇,輸入隊(duì)列名稱(chēng)(Queue Name)FirstQueue朵纷,然后點(diǎn)創(chuàng)建(Create)

下一步我們創(chuàng)建一個(gè)maven 項(xiàng)目炭臭,在pom.xml引入jar

<dependency>?

??<groupId>org.apache.activemq</groupId>

<artifactId>activemq-all</artifactId>

? <version>5.8.0</version>

</dependency>

新建文件 Procuder

package Mq.ActivityMq;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.DeliveryMode;

import javax.jms.Destination;

import javax.jms.JMSException;

import javax.jms.MessageProducer;

import javax.jms.Session;

import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;

import org.apache.activemq.ActiveMQConnectionFactory;

/**

*

* @author 生產(chǎn)者

*

*/

public class Procuder {

? ? //默認(rèn)連接用戶名

? ? private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;

? ? //默認(rèn)連接密碼

? ? private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;

? ? //默認(rèn)連接地址

? ? private static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;

? ? public static void main(String[] args) {

? ? ? ? //連接工廠

? ? ? ? ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKER_URL);

? ? ? ? try {

? ? ? ? ? ? //連接

? ? ? ? ? ? Connection connection = connectionFactory.createConnection();

? ? ? ? ? ? //啟動(dòng)連接

? ? ? ? ? ? connection.start();

? ? ? ? ? ? //創(chuàng)建session

? ? ? ? ? ? Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

? ? ? ? ? ? //消息目的地

? ? ? ? ? ? Destination destination = session.createQueue("FirstQueue");

? ? ? ? ? ? //消息生產(chǎn)者

? ? ? ? ? ? MessageProducer producer = session.createProducer(destination);

? ? ? ? ? ? //設(shè)置不持久化,此處學(xué)習(xí)袍辞,實(shí)際根據(jù)項(xiàng)目決定

? ? ? ? ? ? producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

? ? ? ? ? ? //發(fā)送消息

? ? ? ? ? ? for (int i = 0; i < 5; i++) {

? ? ? ? ? ? ? ? //創(chuàng)建一條文本消息

? ? ? ? ? ? ? ? TextMessage message = session.createTextMessage("你好ActiveMQ: 這是第 " + i + " 條消息");

? ? ? ? ? ? ? ? //生產(chǎn)者發(fā)送消息

? ? ? ? ? ? ? ? producer.send(message);

? ? ? ? ? ? }

? ? ? ? ? ? session.commit();

? ? ? ? ? ? session.close();

? ? ? ? ? ? connection.close();

? ? ? ? } catch (JMSException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? }

}


新建文件Consumer

package Mq.ActivityMq;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.Destination;

import javax.jms.JMSException;

import javax.jms.MessageConsumer;

import javax.jms.Session;

import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;

import org.apache.activemq.ActiveMQConnectionFactory;

/**

*

* @author 消費(fèi)者

*

*/

public class Consumer {

? ? //默認(rèn)連接用戶名

? ? private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;

? ? //默認(rèn)連接密碼

? ? private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;

? ? //默認(rèn)連接地址

? ? private static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;

? ? public static void main(String[] args) {

? ? ? ? //連接工廠

? ? ? ? ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKER_URL);

? ? ? ? try {

? ? ? ? ? ? //連接

? ? ? ? ? ? Connection connection = connectionFactory.createConnection();

? ? ? ? ? ? //啟動(dòng)連接

? ? ? ? ? ? connection.start();

? ? ? ? ? ? //創(chuàng)建session

? ? ? ? ? ? Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

? ? ? ? ? ? //消息目的地

? ? ? ? ? ? Destination destination = session.createQueue("FirstQueue");

? ? ? ? ? ? //消息消費(fèi)者

? ? ? ? ? ? MessageConsumer consumer = session.createConsumer(destination);

? ? ? ? ? ? while (true) {

? ? ? ? ? ? ? ? TextMessage message = (TextMessage) consumer.receive();

? ? ? ? ? ? ? ? if (message != null) {

? ? ? ? ? ? ? ? ? ? System.out.println("接收到消息: " + message.getText());

? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? session.close();

? ? ? ? ? ? connection.close();

? ? ? ? } catch (JMSException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? }

}

測(cè)試結(jié)果

先運(yùn)行Producer(生產(chǎn)者)鞋仍,再運(yùn)行Consumer(消費(fèi)者)


這是我們查看MQ視圖


我們看到有0條等待消費(fèi)的消息,有1條消費(fèi)者搅吁,生產(chǎn)者發(fā)布了5條消息威创,消費(fèi)者消費(fèi)了5條消息。名詞解釋如下:


Messages Enqueued:表示生產(chǎn)了多少條消息谎懦,記做P

Messages Dequeued:表示消費(fèi)了多少條消息肚豺,記做C

Number Of Consumers:表示在該隊(duì)列上還有多少消費(fèi)者在等待接受消息

Number Of Pending Messages:表示還有多少條消息沒(méi)有被消費(fèi),實(shí)際上是表示消息的積壓程度界拦,就是P-C


四吸申、總結(jié)

如上所示只是ActiveMQ簡(jiǎn)單實(shí)例,實(shí)際的業(yè)務(wù)場(chǎng)景需要配置更多的參數(shù)享甸,比如消費(fèi)者消費(fèi)完畢后要通知生成者對(duì)消息進(jìn)行銷(xiāo)毀.....等等截碴,掌握了基本的原理后,其他都是結(jié)合具體業(yè)務(wù)場(chǎng)景水到渠成的事情蛉威。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隐岛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瓷翻,更是在濱河造成了極大的恐慌,老刑警劉巖割坠,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件齐帚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡彼哼,警方通過(guò)查閱死者的電腦和手機(jī)对妄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敢朱,“玉大人剪菱,你說(shuō)我怎么就攤上這事∷┣” “怎么了孝常?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蚓哩。 經(jīng)常有香客問(wèn)我构灸,道長(zhǎng),這世上最難降的妖魔是什么岸梨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任喜颁,我火速辦了婚禮稠氮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘半开。我一直安慰自己隔披,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布寂拆。 她就那樣靜靜地躺著奢米,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漓库。 梳的紋絲不亂的頭發(fā)上恃慧,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音渺蒿,去河邊找鬼痢士。 笑死,一個(gè)胖子當(dāng)著我的面吹牛茂装,可吹牛的內(nèi)容都是我干的怠蹂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼少态,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼城侧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起彼妻,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嫌佑,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后侨歉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體屋摇,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年幽邓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炮温。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牵舵,死狀恐怖柒啤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畸颅,我是刑警寧澤担巩,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站没炒,受9級(jí)特大地震影響兵睛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一祖很、第九天 我趴在偏房一處隱蔽的房頂上張望笛丙。 院中可真熱鬧,春花似錦假颇、人聲如沸胚鸯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)姜钳。三九已至,卻和暖如春形耗,著一層夾襖步出監(jiān)牢的瞬間哥桥,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工激涤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拟糕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓倦踢,卻偏偏與公主長(zhǎng)得像送滞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辱挥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容