日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JMS(1)——基本实例

發(fā)布時間:2025/5/22 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JMS(1)——基本实例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Java Message Service是java ee的規(guī)范之一,可以用來發(fā)送異步消息,在某些場景下,可以作為不同系統(tǒng),或者不同模塊之間的集成方式。可以類比為通過數(shù)據(jù)庫來集成的方式,模塊A完成邏輯以后,往數(shù)據(jù)庫插入一條記錄,模塊B定時輪詢數(shù)據(jù)庫,如果查到相應(yīng)的記錄,就進行處理。JMS集成實際上思路是差不多的功能更強,并且提供了標準的API支持,而且也可以避免反復(fù)輪詢數(shù)據(jù)庫或者讀取文件的I/O操作,對系統(tǒng)的整體性能可能會有提升。


有兩個明顯的優(yōu)點。首先可使2個系統(tǒng)或模塊實現(xiàn)松耦合,模塊A不需要直接調(diào)用模塊B,只需要往jms provider上發(fā)送一條約定格式的消息,模塊B收到這條消息,進行后續(xù)的業(yè)務(wù)處理。其次jms方式是異步的,意味著模塊A發(fā)送消息之后,不需要等待模塊B或者jms provider的響應(yīng),自身的業(yè)務(wù)邏輯可以繼續(xù)。


JMS技術(shù)對應(yīng)的規(guī)范是jsr914,規(guī)范的實現(xiàn)稱為jms provider,常見的實現(xiàn)有ActiveMQ、JBoss MQ、IBM Websphere MQ等。本文以ActiveMQ舉例。


一、ActiveMQ使用

ActiveMQ(其他jms provider也差不多)安裝之后,目錄結(jié)構(gòu)是這樣的

運行bin目錄下的activemq.bat,會根據(jù)默認配置啟動一個broker。各種jms實現(xiàn)都有broker的概念。


啟動之后會占用至少2個端口,默認的是61616和8161。61616是等待jms client的連接,8161是ActiveMQ自帶的一個web應(yīng)用。


http://localhost:8161/demo可看到各種官方提供的例子


http://localhost:8161/admin是ActiveMQ的管理控制臺。這里可以對隊列進行各種操作,如發(fā)送消息,查看消息,清空隊列等。

ActiveMQ即使在不編程的情況下也可以通過這種方式來使用,如用Websphere MQ有時也不編程,直接通過Websphere MQ在兩地進行消息傳輸。當(dāng)然大部分情況還是需要針對jms client進行編程的。



二、jms基本概念


前面說過jms的實現(xiàn),稱為jms provider,可認為是jms的服務(wù)器。jms的客戶端需要開發(fā)人員自行開發(fā),稱為jms client。


jms的消息機制有2種模型,一種是Point to Point,表現(xiàn)為隊列的形式,發(fā)送的消息只能被一個接收者取走。另一種是Topic,可被多個訂閱者訂閱,類似于群發(fā)。

ConnectionFactory用于jms client獲取與jms provider的連接。不同的jms產(chǎn)品對這個接口有不同的實現(xiàn),如說ActiveMQ的該接口的實現(xiàn)類是ActiveMQConnectionFactory。


Connection由ConnectionFactory產(chǎn)生的,表示jms client與jms provider的連接。


Session由Connection產(chǎn)生的,表示一個會話。Session是關(guān)鍵組件,Message、Producer/Consumer、Destination都是在Session上創(chuàng)建的。


Message傳輸?shù)南?#xff0c;包括head、properties、body,其中head必選。


Destination消息源,對發(fā)送者來說就是消息發(fā)到哪里,對接收者來說就是從哪里取消息。Destination有2個子接口,Queue和Topic,分別對應(yīng)上面提到的2種模型。


Message Producer消息發(fā)送者,可注意到這里需要把Destination作為參數(shù),傳入createProducer()方法,說明消息發(fā)送者是綁定到Destination上的,這個發(fā)送者發(fā)送的消息會發(fā)送到這個綁定的Destination上。

// 消息目的地

Destination dest = session.createQueue("dotaQueue");

// 消息發(fā)送者

MessageProducer producer = session.createProducer(dest);


Message Consumer消息接收者,和Message Producer是相反的一種組件。


三、代碼實例

這里基于ActiveMQ進行開發(fā),所以需要導(dǎo)入ActiveMQ提供的jar包。不過開發(fā)時應(yīng)該盡量針對jms接口進行開發(fā),不依賴特定的實現(xiàn)。例子是用main函數(shù)跑的,沒有在JAVA EE容器里跑,所以沒有辦法依賴JNDI拿到ConnectionFactory的實例,只能手工創(chuàng)建ActiveMQConnectionFactory,所以和ActiveMQ的實現(xiàn)耦合了,沒有辦法連到別的jms實現(xiàn)上。如果實際的代碼用JNDI或者spring來獲取ConnectionFactory的實例的話,那就可以僅針對接口編程,連接到任意jms provider了。為了簡單起見例子也沒有用到spring,實際上spring對jms client提供了很好的支持。本例開發(fā)環(huán)境只要導(dǎo)入activemq-all-5.6.0.jar,里面已經(jīng)包括了jms API、activemq-core、javaee-management API等必須的class。


Message Producer

public class Main { ?

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

? ? String jmsProviderAddress = "tcp://localhost:61616";// ?地址

? ? ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(jmsProviderAddress);// 連接器

? ? Connection connection = connectionFactory.createConnection();// ?創(chuàng)建連接

? ?Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);// ?打開會話

? ?Destination dest = session.createQueue("demoQueue");// ?消息目的地

? ?MessageProducer producer = session.createProducer(dest);// ?消息發(fā)送者

? ?Message message = session.createTextMessage("hello world");// ?消息

? ?producer.send(message);// 發(fā)送 ?

? ?producer.close();// 關(guān)閉

? ?session.close();

? ?connection.close();

? ?} ?

} ?

代碼很簡單,可以參考上面的圖,各組件的關(guān)系比較清楚。


Message Consumer

public static void main(String[] args) throws JMSException {

? ?String jmsProviderAddress = "tcp://localhost:61616";// 地址

? ?ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(jmsProviderAddress);//連接器

? ?Connection connection = connectionFactory.createConnection();// 創(chuàng)建連接

? ?Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);// 打開會話

? ?String destinationName = "demoQueue";

? ?Destination dest = session.createQueue(destinationName);// 消息來源地

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

? ?connection.start();

? ?Message message = consumer.receive();

? ?TextMessage textMessage = (TextMessage) message;

? ?String text = textMessage.getText();

? ?System.out.println("從ActiveMQ取回一條消息: " + text);

? ?consumer.close();

? ?session.close();

? ?connection.close();

} ?

和MessageProducer的代碼基本類似,實際中一般會實現(xiàn)javax.jms.MessageListener接口,這樣就不需要手工調(diào)用receive()方法。

原帖地址:http://www.iteye.com/topic/1125922


轉(zhuǎn)載于:https://blog.51cto.com/woshixy/1410063

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的JMS(1)——基本实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。