activemq部署安裝

一、架構和技術介紹

1、簡介

ActiveMQ?Apache出品,最流行的,能力強勁的開源消息總線。完全支持JMS1.1J2EE 1.4規范的?JMS Provider實現

2、activemq的特性

1.?多種語言和協議編寫客戶端。語言: Java, C, C++, C#, Ruby, Perl, Python, PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP

2.?完全支持JMS1.1J2EE 1.4規范?(持久化,XA消息,事務)

3.?Spring的支持,ActiveMQ可以很容易內嵌到使用Spring的系統里面去,而且也支持Spring2.0的特性

4.?通過了常見J2EE服務器(?Geronimo,JBoss 4, GlassFish,WebLogic)的測試,其中通過JCA 1.5 resourceadaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE1.4商業服務器上

5.?支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

6.?支持通過JDBCjournal提供高速的消息持久化

7.?從設計上保證了高性能的集群,客戶端-服務器,點對點

8.?支持Ajax

9.?支持與Axis的整合

10.?可以很容易得調用內嵌JMS provider,進行測試

3、下載和安裝ActiveMQ

1、下載

ActiveMQ的最新版本是5.10.0,但由于我們內網下載存在問題,所以目前通過內網只能下載到5.9.0,下載地址:http://activemq.apache.org/activemq-590-release.html

2、安裝

?????????如果是在windows系統中運行,可以直接解壓apache-activemq-5.9.0-bin.zip,并運行bin目錄下的activemq.bat文件,此時使用的是默認的服務端口:61616和默認的console端口:8161

?????????如果是在linuxunix下運行,在bin目錄下執行命令:./activemq setup

3、修改ActiveMQ的服務端口和console端口

???????? A、修改服務端口:打開conf/activemq.xml文件,修改以下紅色字體部分

????????<transportConnectors>

???????????<transportConnector name="openwire" uri="tcp://10.42.220.72:61618"discoveryUri="multicast://default"/>

???????</transportConnectors>

?

B、修改console的地址和端口:打開conf/jetty.xml文件,修改以下紅色字體部分

????<bean id="jettyPort"class="org.apache.activemq.web.WebConsolePort"init-method="start">

???????<property name="port" value="8162"/>

?</bean>

4、通過客戶端代碼試用ActiveMQ

??????? 需要提前將activemq解壓包中的lib目錄下的相關包引入到工程中,再進行如下編碼:

1、發送端的代碼:

importjavax.jms.Connection;

importjavax.jms.ConnectionFactory;

importjavax.jms.DeliveryMode;

importjavax.jms.Destination;

importjavax.jms.MessageProducer;

importjavax.jms.Session;

importjavax.jms.TextMessage;

importorg.apache.activemq.ActiveMQConnection;

importorg.apache.activemq.ActiveMQConnectionFactory;

publicclass?Sender {

????privatestaticfinalintSEND_NUMBER?= 5;

?

????publicstaticvoid?main(String[] args) {

????????// ConnectionFactory:連接工廠,JMS用它創建連接

????????ConnectionFactory connectionFactory;

????????// ConnectionJMS客戶端到JMS Provider的連接

????????Connection connection =?null;

????????// Session一個發送或接收消息的線程

????????Session session;

????????// Destination:消息的目的地;消息發送給誰.

????????Destination destination;

????????// MessageProducer:消息發送者

????????MessageProducer producer;

????????// TextMessage message;

????????//構造ConnectionFactory實例對象,此處采用ActiveMq的實現jar

????????connectionFactory =?new?ActiveMQConnectionFactory(

????????????????ActiveMQConnection.DEFAULT_USER,

????????????????ActiveMQConnection.DEFAULT_PASSWORD,

????????????????"failover:(tcp://10.42.220.72:61617,tcp://10.42.220.72:61618)");

????????try?{

????????????//構造從工廠得到連接對象

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

????????????//啟動

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

????????????//獲取操作連接

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

????????????//獲取session

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

????????????//得到消息生成者【發送者】

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

????????????//設置不持久化,此處學習,實際根據項目決定

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

????????????//構造消息,此處寫死,項目就是參數,或者方法獲取

????????????sendMessage(session, producer);

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

????????}?catch?(Exception e) {

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

????????}?finally?{

????????????try?{

????????????????if?(null?!= connection)

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

????????????}?catch?(Throwable ignore) {

????????????}

????????}

????????}

???

????publicstaticvoid?sendMessage(Session session,MessageProducer producer)

????????????throws?Exception {

????????for?(int?i = 1; i <=SEND_NUMBER; i++) {

????????????TextMessage message = session

????????????????????.createTextMessage("ActiveMq發送的消息"?+ i);

????????????//發送消息到目的地方

????????????System.out.println("發送消息:"?+?"ActiveMq?發送的消息"?+ i);

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

????????}

????}

}

?

2、接收端代碼:

importjavax.jms.Connection;

importjavax.jms.ConnectionFactory;

importjavax.jms.Destination;

importjavax.jms.MessageConsumer;

importjavax.jms.Session;

importjavax.jms.TextMessage;

importorg.apache.activemq.ActiveMQConnection;

importorg.apache.activemq.ActiveMQConnectionFactory;

?

publicclass?Receive {

????publicstaticvoid?main(String[] args) {

????????// ConnectionFactory:連接工廠,JMS用它創建連接

????????ConnectionFactory connectionFactory;

????????// ConnectionJMS客戶端到JMS Provider的連接

????????Connection connection =?null;

????????// Session一個發送或接收消息的線程

????????Session session;

????????// Destination:消息的目的地;消息發送給誰.

????????Destination destination;

????????//消費者,消息接收者

????????MessageConsumer consumer;

????????connectionFactory =?new?ActiveMQConnectionFactory(

????????????????ActiveMQConnection.DEFAULT_USER,

????????????????ActiveMQConnection.DEFAULT_PASSWORD,

????????????????"failover:(tcp://10.42.220.72:61617,tcp://10.42.220.72:61618)");

????????try?{

????????????//構造從工廠得到連接對象

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

????????????//啟動

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

????????????//獲取操作連接

????????????session = connection.createSession(false,

????????????????????Session.AUTO_ACKNOWLEDGE);

????????????//獲取session

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

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

????????????while?(true) {

????????????????//設置接收者接收消息的時間,為了便于測試,這里誰定為100s

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

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

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

????????????????}?else?{

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

????????????????}

????????????}

????????}?catch?(Exception e) {

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

????????}?finally?{

????????????try?{

????????????????if?(null?!= connection)

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

????????????}?catch?(Throwable ignore) {

????????????}

????????}

????}

}

3、通過監控查看消息堆棧的記錄:

??????登陸http://localhost:8162/admin/queues.jsp,默認的用戶名和密碼:admin/admin

p1.png

二、ActiveMQ的多種部署方式

?????????單點的ActiveMQ作為企業應用無法滿足高可用和集群的需求,所以ActiveMQ提供了master-slavebroker cluster等多種部署方式,但通過分析多種部署方式之后我認為需要將兩種部署方式相結合才能滿足我們公司分布式和高可用的需求,所以后面就重點將解如何將兩種部署方式相結合。

1、Master-Slave部署方式
1)shared filesystem Master-Slave部署方式

?????????主要是通過共享存儲目錄來實現masterslave的熱備,所有的ActiveMQ應用都在不斷地獲取共享目錄的控制權,哪個應用搶到了控制權,它就成為master

?????????多個共享存儲目錄的應用,誰先啟動,誰就可以最早取得共享目錄的控制權成為master,其他的應用就只能作為slave

p2.png

2)shared database Master-Slave方式

?????????shared filesystem方式類似,只是共享的存儲介質由文件系統改成了數據庫而已。

3)Replicated LevelDB Store方式

?????????這種主備方式是ActiveMQ5.9以后才新增的特性,使用ZooKeeper協調選擇一個node作為master。被選擇的master broker node開啟并接受客戶端連接。

其他node轉入slave模式,連接master并同步他們的存儲狀態。slave不接受客戶端連接。所有的存儲操作都將被復制到連接至Masterslaves

如果master死了,得到了最新更新的slave被允許成為masterfialed node能夠重新加入到網絡中并連接master進入slave mode。所有需要同步的disk的消息操作都將等待存儲狀態被復制到其他法定節點的操作完成才能完成。所以,如果你配置了replicas=3,那么法定大小是(3/2)+1=2. Master將會存儲并更新然后等待?(2-1)=1slave存儲和更新完成,才匯報success。至于為什么是2-1,熟悉Zookeeper的應該知道,有一個node要作為觀擦者存在。

單一個新的master被選中,你需要至少保障一個法定node在線以能夠找到擁有最新狀態的node。這個node將會成為新的master。因此,推薦運行至少3replica nodes,以防止一個node失敗了,服務中斷。

p3.png

2、Broker-Cluster部署方式

?????????前面的Master-Slave的方式雖然能解決多服務熱備的高可用問題,但無法解決負載均衡和分布式的問題。Broker-Cluster的部署方式就可以解決負載均衡的問題。

???????? Broker-Cluster部署方式中,各個broker通過網絡互相連接,并共享queue。當broker-A上面指定的queue-A中接收到一個message處于pending狀態,而此時沒有consumer連接broker-A時。如果cluster中的broker-B上面由一個consumer在消費queue-A的消息,那么broker-B會先通過內部網絡獲取到broker-A上面的message,并通知自己的consumer來消費。

1)static Broker-Cluster部署

?????????activemq.xml文件中靜態指定Broker需要建立橋連接的其他Broker

1、??首先在Broker-A節點中添加networkConnector節點:

<networkConnectors>?

??????????????? <networkConnector?? uri="static:(tcp:// 0.0.0.0:61617)"duplex="false"/>

</networkConnectors>

2、??修改Broker-A節點中的服務提供端口為61616

<transportConnectors>

?? ??????<transportConnectorname="openwire"uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

3、??Broker-B節點中添加networkConnector節點:

<networkConnectors>?

? ????????????? <networkConnector?? uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>

</networkConnectors>

4、??修改Broker-A節點中的服務提供端口為61617

<transportConnectors>

?? ??????<transportConnectorname="openwire"uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

5、分別啟動Broker-ABroker-B

2)Dynamic Broker-Cluster部署

?????????activemq.xml文件中不直接指定Broker需要建立橋連接的其他Broker,由activemq在啟動后動態查找:

1、??首先在Broker-A節點中添加networkConnector節點:

<networkConnectors>?

??????????????? <networkConnectoruri="multicast://default"

???????????dynamicOnly="true"

???????????networkTTL="3"

???????????prefetchSize="1"

???????????decreaseNetworkConsumerPriority="true" />

</networkConnectors>

2、修改Broker-A節點中的服務提供端口為61616

<transportConnectors>

?? ??????<transportConnectorname="openwire"uri="tcp://0.0.0.0:61616? " discoveryUri="multicast://default"/>

</transportConnectors>

3、在Broker-B節點中添加networkConnector節點:

<networkConnectors>?

??????????????? <networkConnectoruri="multicast://default"

???????????dynamicOnly="true"

???????????networkTTL="3"

???????????prefetchSize="1"

???????????decreaseNetworkConsumerPriority="true" />

</networkConnectors>

4、修改Broker-B節點中的服務提供端口為61617

<transportConnectors>

?? ??????<transportConnectorname="openwire"uri="tcp://0.0.0.0:61617" discoveryUri="multicast://default"/>

</transportConnectors>

5、啟動Broker-ABroker-B

2、Master-Slave與Broker-Cluster相結合的部署方式

?????????可以看到Master-Slave的部署方式雖然解決了高可用的問題,但不支持負載均衡,Broker-Cluster解決了負載均衡,但當其中一個Broker突然宕掉的話,那么存在于該Broker上處于Pending狀態的message將會丟失,無法達到高可用的目的。

?????????由于目前ActiveMQ官網上并沒有一個明確的將兩種部署方式相結合的部署方案,所以我嘗試者把兩者結合起來部署:

?????????p4.png

1、部署的配置修改

?????????這里以Broker-A + Broker-B建立clusterBroker-C作為Broker-Bslave為例:

1)首先在Broker-A節點中添加networkConnector節點:

<networkConnectors>?

??????????????? <networkConnector?? uri="masterslave:(tcp://0.0.0.0:61617,tcp:// 0.0.0.0:61618)" duplex="false"/>

</networkConnectors>

2)修改Broker-A節點中的服務提供端口為61616

<transportConnectors>

?? ??????<transportConnectorname="openwire"uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

3)Broker-B節點中添加networkConnector節點:

<networkConnectors>?

??????????????? <networkConnector?? uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>

</networkConnectors>

4)修改Broker-B節點中的服務提供端口為61617

<transportConnectors>

?? ??????<transportConnectorname="openwire"uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

5)修改Broker-B節點中的持久化方式:

??????<persistenceAdapter>

???????????<kahaDB directory="/localhost/kahadb"/>

????? ??</persistenceAdapter>

6)Broker-C節點中添加networkConnector節點:

<networkConnectors>?

??????????????? <networkConnector?? uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>

</networkConnectors>

7)修改Broker-C節點中的服務提供端口為61618

<transportConnectors>

?? ??????<transportConnectorname="openwire"uri="tcp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

8)修改Broker-B節點中的持久化方式:

??????<persistenceAdapter>

???????????<kahaDB directory="/localhost/kahadb"/>

???????</persistenceAdapter>

9)分別啟動broker-Abroker-Bbroker-C,因為是broker-B先啟動,所以“/localhost/kahadb”目錄被lock住,broker-C將一直處于掛起狀態,當人為停掉broker-B之后,broker-C將獲取目錄“/localhost/kahadb”的控制權,重新與broker-A組成cluster提供服務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387881.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python初學者_面向初學者的20種重要的Python技巧

python初學者Python is among the most widely used market programming languages in the world. This is because of a variety of driving factors:Python是世界上使用最廣泛的市場編程語言之一。 這是由于多種驅動因素&#xff1a; It’s simple to understand. 很容易理解…

主串與模式串的匹配

主串與模式串的匹配 &#xff08;1&#xff09;BF算法&#xff1a; BF算法比較簡單直觀&#xff0c;其匹配原理是主串S.ch[i]和模式串T.ch[j]比較&#xff0c;若相等&#xff0c;則i和j分別指示串中的下一個位置&#xff0c;繼續比較后續字符&#xff0c;若不相等&#xff0c;從…

什么是 DDoS 攻擊?

歡迎訪問網易云社區&#xff0c;了解更多網易技術產品運營經驗。 全稱Distributed Denial of Service&#xff0c;中文意思為“分布式拒絕服務”&#xff0c;就是利用大量合法的分布式服務器對目標發送請求&#xff0c;從而導致正常合法用戶無法獲得服務。通俗點講就是利用網絡…

nginx 并發過十萬

一般來說nginx 配置文件中對優化比較有作用的為以下幾項&#xff1a; worker_processes 8; nginx 進程數&#xff0c;建議按照cpu 數目來指定&#xff0c;一般為它的倍數。 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 為每…

貝葉斯網絡建模

I am feeling sick. Fever. Cough. Stuffy nose. And it’s wintertime. Do I have the flu? Likely. Plus I have muscle pain. More likely.我感到惡心。 發熱。 咳嗽。 鼻塞。 現在是冬天。 我有流感嗎&#xff1f; 可能吧 另外我有肌肉疼痛。 更傾向于。 Bayesian networ…

長春南關區凈月大街附近都有哪些課后班?

長春南關區凈月大街附近都有哪些課后班&#xff1f;在學校的教育不能滿足廣大學生的需求的時候&#xff0c;一對一輔導、文化課輔導、高考輔導等越來越多的家長和孩子的選擇。相對于學校的大課教育&#xff0c;一對一輔導有著自身獨特的優勢&#xff0c;一對一輔導有著學校教學…

dev中文本框等獲取焦點事件

<ClientSideEvents GotFocus"GotFocus" /> editContract.SetFocus()//設置文本框等的焦點 function GotFocus(s, e) { window.top.DLG.show(700, 600, "PrePayment/ContractSelect.aspx", "選擇", null ); }…

數據科學家數據分析師_使您的分析師和數據科學家在數據處理方面保持一致

數據科學家數據分析師According to a recent survey conducted by Dimensional Research, only 50 percent of data analysts’ time is actually spent analyzing data. What’s the other half spent on? Data cleanup — that tedious and repetitive work that must be do…

神經網絡使用情景

神經網絡使用情景 人臉&#xff0f;圖像識別語音搜索文本到語音&#xff08;轉錄&#xff09;垃圾郵件篩選&#xff08;異常情況探測&#xff09;欺詐探測推薦系統&#xff08;客戶關系管理、廣告技術、避免用戶流失&#xff09;回歸分析 為何選擇Deeplearning4j&#xff1f; …

BZOJ4890 Tjoi2017城市

顯然刪掉的邊肯定是直徑上的邊。考慮枚舉刪哪一條。然后考慮怎么連。顯然新邊應該滿足其兩端點在各自樹中作為根能使樹深度最小。只要線性求出這個東西就可以了&#xff0c;這與求樹的重心的過程類似。 #include<iostream> #include<cstdio> #include<cmath>…

【國際專場】laravel多用戶平臺(SaaS, 如淘寶多用戶商城)的搭建策略

想不想用Laravel來搭建一個多用戶、或多租戶平臺&#xff1f;比如像淘寶那樣的多商戶平臺呢&#xff1f;聽上去很復雜&#xff0c;不是嗎&#xff1f;怎么能一個程序&#xff0c;給那么多的機構用戶來用呢&#xff1f;如何協調管理它們呢&#xff1f;數據庫怎么搭建呢&#xff…

GitHub常用命令及使用

GitHub使用介紹 摘要&#xff1a; 常用命令&#xff1a; git init 新建一個空的倉庫git status 查看狀態git add . 添加文件git commit -m 注釋 提交添加的文件并備注說明git remote add origin gitgithub.com:jinzhaogit/git.git 連接遠程倉庫git push -u origin master 將本地…

神經網絡的類型

KNN DNN SVM DL BP DBN RBF CNN RNN ANN 概述 本文主要介紹了當前常用的神經網絡&#xff0c;這些神經網絡主要有哪些用途&#xff0c;以及各種神經網絡的優點和局限性。 1 BP神經網絡 BP (Back Propagation)神經網絡是一種神經網絡學習算法。其由輸入層、中間層、輸出層組成的…

python db2查詢_如何將DB2查詢轉換為python腳本

python db2查詢Many companies are running common data analytics tasks using python scripts. They are asking employees to convert scripts that may currently exist in SAS or other toolsets to python. One step of this process is being able to pull in the same …

Dapper基礎知識三

在下剛畢業工作&#xff0c;之前實習有用到Dapper&#xff1f;這幾天新項目想用上Dapper&#xff0c;在下比較菜鳥&#xff0c;這塊只是個人對Dapper的一種總結。 Dapper&#xff0c;當項目在開發的時候&#xff0c;在沒有必要使用依賴注入的時候&#xff0c;如何做到對項目的快…

deeplearning4j

deeplearning4j 是基于java的深度學習庫&#xff0c;當然&#xff0c;它有許多特點&#xff0c;但暫時還沒學那么深入&#xff0c;所以就不做介紹了 需要學習dl4j&#xff0c;無從下手&#xff0c;就想著先看看官網的examples&#xff0c;于是&#xff0c;下載了examples程序&a…

PostgreSQL 11 1Kw TPCC , 1億 TPCB 7*24 強壓耐久測試

標簽 PostgreSQL , tpcc , tpcb 背景 TPCC, TPCB是工業標準的OLTP類型業務的數據庫測試&#xff0c;包含大量的讀、寫、更新、刪除操作。 7*24小時強壓耐久測試&#xff0c;主要看數據庫在長時間最大壓力下的 性能、穩定性、可靠性。 測試CASE &#xff1a; 1、1000萬 tpcc 2、…

推理編程_答案集編程的知識表示和推理

推理編程Read about the difference between declarative and imperative programming and learn from code examples (Answer Set Programming, Python and C).了解聲明式和命令式編程之間的區別&#xff0c;并從代碼示例(答案集編程&#xff0c;Python和C)中學習。 介紹 (In…

給Hadoop初學者的一些建議

我們介紹了新手學習hadoop的入門注意事項。這篇來談談hadoop核心知識學習。 hadoop核心知識學習: hadoop分為hadoop1.X和hadoop2.X&#xff0c;并且還有hadoop生態系統。這里只能慢慢介紹了。一口也吃不成胖子。 那么下面我們以hadoop2.x為例進行詳細介紹&#xff1a; Hadoop…

Guide AHOI2017 洛谷P3720

Description 農場主John最近在網上買了一輛新車&#xff0c;在購買汽車配件時&#xff0c;John不小心點了兩次“提交”按鈕。導致汽車上安裝了兩套GPS系統&#xff0c;更糟糕的是John在使用GPS導航時&#xff0c;兩套系統常常給出不同的路線。從地圖上看&#xff0c;John居住的…