資源描述:
《activemq高并發(fā)處理方案》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、高并發(fā)發(fā)送消息異常解決方法:現(xiàn)象:使用10個線程每100ms發(fā)送一條消息,大約3000多條后,出現(xiàn)異常,所有線程停止:?javax.jms.JMSException:CouldnotconnecttobrokerURL:tcp://localhost:61616.Reason:java.net.BindException:Addressalreadyinuse:connect;nestedexceptionisjava.net.BindException:Addressalreadyinuse:connect原因:創(chuàng)建了太
2、多jms連接沒有來得及回收解決方法:使用jms連接池原來的配置:org.apache.activemq.jndi.ActiveMQInitialContextFactorytcp://huzq-linux:61616
3、ConnectionFactory修改為:4、n>
解決activemq多消費者并發(fā)處理遇到一個現(xiàn)象,如果activemq隊列積壓了數(shù)據(jù)的話,如果在spring中啟動listner,只有一個consumer執(zhí)行,查閱了很多資料,無果,后來偶爾通過activemq的監(jiān)控網(wǎng)頁看到消費者列表中,只有一個消費者有等待處理的數(shù)據(jù),其他都沒有,如下圖:由此得知,activemq有一定機制將隊列中的數(shù)據(jù)交給consumer處理,這個機制就是數(shù)據(jù)的數(shù)量分配,查資料得知,默認(rèn)是1000,因此,把這個值調(diào)小就可以了。在客戶端的連接url中,修改為tcp:
5、//ipaddr:61616?jms.prefetchPolicy.all=2這樣基本消費者就分配公平了,不會出現(xiàn)一個消費者忙死,另外的消費者閑死了。為高并發(fā)程序部署ActiveMQ使用ActiveMQ來擴展你的應(yīng)用程序需要一些時間并要花一些精力.本節(jié)中我們將介紹三種技術(shù)用于擴展應(yīng)用程序.我們將從垂直擴展開始,這種擴展方式中,單個代理需要處理成千上萬的連接和消息隊列.接下來我們將介紹水平擴展,這種擴展方式需要處理比前一種方式更多的網(wǎng)絡(luò)連接.最后,我們介紹的傳輸負(fù)載分流,可以在擴展和性能間得到平衡,但是會增加ActiveMQ
6、程序的復(fù)雜性.1.垂直擴展:垂直擴展是一種用于增加單個ActiveMQ代理連接數(shù)(因而也增加了負(fù)載能力)的技術(shù).默認(rèn)情況下,ActiveMQ的被設(shè)計成盡可高效的傳輸消息以確保低延遲和良好的性能.但是,你也可以進行一些配置使的ActiveMQ代理可以同時處理大量并發(fā)的連接以及大量的消息隊列.默認(rèn)情況下,ActiveMQ使用阻塞IO來處理傳輸連接,這種方式為每一個連接分配一個線程.你可以為ActiveMQ代理使用非阻塞IO(同時客戶端可以使用默認(rèn)的傳輸)以減少線程的使用.可以在ActiveMQ的配置文件中通過傳輸連接器配置非阻
7、塞IO.下面的是配置非阻塞IO的示例代碼:配置NIO傳輸連接器除了為每個連接使用一個線程的阻塞IO,ActiveMQ還可以為每一個客戶端連接使用一個消息分發(fā)線程.你可以通過將系統(tǒng)參數(shù)org.apache.activemq.UseDedicatedTaskRunner設(shè)置為false來設(shè)置A
8、ctiveMQ使用一個搞線程池.下面是一個示例:ACTIVEMQ_OPTS="-Dorg.apache.activemq.UseDedicatedTaskRunner=false"確保ActiveMQ代理用于足夠的內(nèi)存來處理大量的并發(fā)連接,需要分兩步進行:首先,你需要確保運行ActiveMQ的JVM在啟