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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【JMS】JMS详解

發布時間:2024/4/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JMS】JMS详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、JMS介紹

??????JMS即Java消息服務(Java Message Service)應用程序接口,是一個Java平臺中關于面向消息中間件(MOM)的API,用于在兩個應用程序之間,或者在分布式系統中發送消息,進行異步通信。Java消息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支持。
??????JMS源于企業應用對于消息中間件的需求,使應用程序可以通過消息進行異步處理而互不影響。Sun公司和他的合作伙伴設計的JMS API定義了一組公共的應用程序接口和相應語法,使得Java程序能夠和其它消息組件進行通信。JMS可以使你通過消息收發服務(有時稱為消息中介程序或路由器)從一個JMS客戶機向另一個JMS客戶機發送消息。

二、JMS的體系架構

JMS由以下元素組成:

1、JMS提供者
連接面向消息中間件的,JMS接口的一個實現。提供者可以是Java平臺的JMS實現,也可以是非Java平臺的面向消息中間件的適配器。JMS服務提供者實現消息隊列和通知,同時實現消息管理API。JMS已經是J2EE API的一部分了,J2EE服務器提供JMS服務。

2、JMS客戶
生產或消費基于消息的Java的應用程序或對象。

3、JMS生產者
創建并發送消息的JMS客戶。

4、JMS消費者
接收消息的JMS客戶。

5、JMS消息
包括可以在JMS客戶之間傳遞數據的對象。消息是服務提供者和客戶端之間傳遞信息所使用信息單元。JMS消息由以下三部分組成:

  • 消息頭(header)—JMS消息頭包含許多字段,它們是消息發送后由JMS提供者或消息發送者產生的,用來表示消息、設置優先權和失效時間等等,并且為消息確定路由。
  • 屬性(property)—用來添加刪除消息頭以外的附加消息。
  • 消息體(body)—JMS中定義了5種消息體:ByteMessage、MapMessage、ObjectMessage、StreamMessage和TextMessage。

6、JMS隊列
一個容納那些被發送的等待閱讀的消息的區域。與隊列名字所暗示的意思不同,消息的接受順序并不一定要與消息的發送順序相同。一旦一個消息被閱讀,該消息將被從隊列中移走。

7、JMS主題
一種支持發送消息給多個訂閱者的機制。

三、JMS的五種消息類型

JMS1.1規范中規定了五種JMS類型:ByteMessage、MapMessage、ObjectMessage、StreamMessage和TextMessage。下面我們來逐個介紹:

1.創建一個TextMessage

TextMessage message = session.createTextMessage(“test”);

message.setText(“test”);

2.解包一個TextMessage,去解包一個TextMessage類型的消息,客戶端可以使用Message.getText方法:

TextMessage message = (TextMessage) consumer.receive();
String text=message.getText();

3.創建一個BytesMessage

byte[] stockData;
BytesMessage message= session.createBytesMessage();
message.writeBytes(stockData);

4.解包一個BytesMessage,當接收到一個ByteMessage時,可以使用下面的方式來解包:

byte[] stockInfo;
int length;
length = message.readBytes(stockData);
消息體被拷貝到字節數組,客戶端程序可以讀取這個樹組來解釋數據。

5.創建一個MapMessage

MapMessage message;
message = session.createMapMessage();
//其他代碼
message.setString(“Name”, “CN-Java”);
message.setDouble(“Value”, stockValue);
message.setLong(“Time”, stockTime);
message.setDouble(“Diff”, stockDiff);
message.setString(“Info”, “Recent server announcement causes market interest”);

6.解包一個MapMessage

stockName = message.getString(“Name”);
stockDiff = message.getDouble(“Diff”);
stockValue = message.getDouble(“Value”);
stockTime = message.getLong(“Time”);
如果你想得到整個元素的列表,可以使用MapMessage.getMapNames方法來獲得。

7.創建一個StreamMessage

和MapMessage相似,一個應用程序可以按序列發送多個字段到一個消息中,這些字段都是原始類型的,要做這些,你可以使用一個StreamMessage,
message.writeString(stockName);
message.writeDouble(stockValue);
message.writeLong(stockTime);
message.writeDouble(stockDiff);
message.writeString(stockInfo);

8.解包一個StreamMessage

StreamMessage中的元素必須按照被寫入的順序讀出:
stockName = message.readString();
stockValue = message.readDouble();
stockTime = message.readLong();
stockDiff = message.readDouble();
stockInfo = message.readString();

9.創建一個ObjectMessage

ObjectMessage message;
message = session.createObjectMessage();
message.setObject(stockObject);

10.解包ObjectMessage

去解包ObjectMessage,使用ObjectMessage.getObject得到對象,一但對象被取出來,客戶端程序使用Java造型語句將對象還原成原始對象。
StockObject stockObject;
stockObject = (StockObject)message.getObject();

四、JMS對象模型和應用程序接口

JMS對象模型包含如下幾個要素:

1.連接工廠。連接工廠(ConnectionFactory)是由管理員創建,并綁定到JNDI樹中。客戶端使用JNDI查找連接工廠,然后利用連接工廠創建一個JMS連接。

2.JMS連接。JMS連接(Connection)表示JMS客戶端和服務器端之間的一個活動的連接,是由客戶端通過調用連接工廠的方法建立的。

3.JMS會話。JMS會話(Session)表示JMS客戶與JMS服務器之間的會話狀態。JMS會話建立在JMS連接上,表示客戶與服務器之間的一個會話線程。

4.JMS目的。JMS目的(Destination),又稱為消息隊列,是實際的消息源。

5.JMS生產者和消費者。
生產者(Message Producer)和消費者(Message Consumer)對象由Session對象創建,用于發送和接收消息。

6.JMS消息
通常有兩種類型:
① 點對點(Point-to-Point)。在點對點的消息系統中,消息分發給一個單獨的使用者。點對點消息往往與隊列(javax.jms.Queue)相關聯。

② 發布/訂閱(Publish/Subscribe)。發布/訂閱消息系統支持一個事件驅動模型,消息生產者和消費者都參與消息的傳遞。生產者發布事件,而使用者訂閱感興趣的事件,并使用事件。該類型消息一般與特定的主題(javax.jms.Topic)關聯。

應用程序接口

ConnectionFactory 接口(連接工廠)
??????用戶用來創建到JMS提供者的連接的被管對象。JMS客戶通過可移植的接口訪問連接,這樣當下層的實現改變時,代碼不需要進行修改。管理員在JNDI名字空間中配置連接工廠,這樣,JMS客戶才能夠查找到它們。根據消息類型的不同,用戶將使用隊列連接工廠,或者主題連接工廠。

Connection 接口(連接)
??????連接代表了應用程序和消息服務器之間的通信鏈路。在獲得了連接工廠后,就可以創建一個與JMS提供者的連接。根據不同的連接類型,連接允許用戶創建會話,以發送和接收隊列和主題到目標。

Destination 接口(目標)
??????目標是一個包裝了消息目標標識符的被管對象,消息目標是指消息發布和接收的地點,或者是隊列,或者是主題。JMS管理員創建這些對象,然后用戶通過JNDI發現它們。和連接工廠一樣,管理員可以創建兩種類型的目標,點對點模型的隊列,以及發布者/訂閱者模型的主題。

Session 接口(會話)
??????表示一個單線程的上下文,用于發送和接收消息。由于會話是單線程的,所以消息是連續的,就是說消息是按照發送的順序一個一個接收的。會話的好處是它支持事務。如果用戶選擇了事務支持,會話上下文將保存一組消息,直到事務被提交才發送這些消息。在提交事務之前,用戶可以使用回滾操作取消這些消息。一個會話允許用戶創建消息,生產者來發送消息,消費者來接收消息。

MessageConsumer 接口(消息消費者)
??????由會話創建的對象,用于接收發送到目標的消息。消費者可以同步地(阻塞模式),或(非阻塞)接收隊列和主題類型的消息。

MessageProducer 接口(消息生產者)
??????由會話創建的對象,用于發送消息到目標。用戶可以創建某個目標的發送者,也可以創建一個通用的發送者,在發送消息時指定目標。

Message 接口(消息)
??????是在消費者和生產者之間傳送的對象,也就是說從一個應用程序傳送到另一個應用程序。

五、JMS通信方式

JMS通信方式分為點對點通信和發布/訂閱方式

1.點對點方式(point-to-point)

??????點對點的消息發送方式主要建立在 Message Queue,Sender,reciever上,Message Queue 存貯消息,Sender 發送消息,receive接收消息.具體點就是Sender Client發送Message Queue ,而 receiver Cliernt從Queue中接收消息和”發送消息已接受”到Quere,確認消息接收。
??????消息發送客戶端與接收客戶端沒有時間上的依賴,發送客戶端可以在任何時刻發送信息到Queue,而不需要知道接收客戶端是不是在運行 。也就是說,點對點的方式下,一個生產者向一個特定的隊列發布消息,一個消費者從該隊列中讀取消息。這里,生產者知道消費者的隊列,并直接將消息發送到消費者的隊列。可以概括為:只有一個消費者將獲得消息,生產者不需要在接收者消費該消息期間處于運行狀態,接收者也同樣不需要在消息發送時處于運行狀態,每一個成功處理的消息都由接收者簽收。

2.發布/訂閱 方式(publish/subscriber Messaging)

??????發布/訂閱方式用于多個接收端的方式。作為發布訂閱的方式,可能存在多個接收端,并且接收端與發送端存在時間上的依賴。一個接收端只能接收它創建以后發送端發送的信息。作為subscriber ,在接收消息時有兩種方法,destination的receive方法,和實現message listener 接口的onMessage 方法。
??????發布者/訂閱者方式支持向一個特定的消息主題發布消息。0或多個訂閱者可能對接收來自特定消息主題的消息感興趣。在這種方式下,發布者和訂閱者彼此不知道對方。這種方式好比是匿名公告板。這種方式被概括為:
??????多個消費者可以獲得消息。在發布者和訂閱者之間存在時間依賴性。發布者需要建立一個訂閱(subscription),以便客戶能夠訂閱。訂閱者必須保持持續的活動狀態以接收消息,除非訂閱者建立了持久的訂閱。在那種情況下,在訂閱者未連接時發布的消息將在訂閱者重新連接時重新發布。

六、JMS消息傳遞方式

??????JMS有兩種傳遞消息的方式。標記為NON_PERSISTENT的消息最多投遞一次,而標記為PERSISTENT的消息將使用暫存后再轉送的機理投遞。如果一個JMS服務離線,那么持久性消息不會丟失但是得等到這個服務恢復聯機時才會被傳遞。所以默認的消息傳遞方式是非持久性的。即使使用非持久性消息可能降低內務和需要的存儲器,并且這種傳遞方式只有當你不需要接收所有的消息時才使用。
??????雖然JMS規范并不需要JMS供應商實現消息的優先級路線,但是它需要遞送加快的消息優先于普通級別的消息。JMS定義了從0到9的優先級路線級別,0是最低的優先級而9則是最高的。更特殊的是0到4是正常優先級的變化幅度,而5到9是加快的優先級的變化幅度。舉例來說:

topicPublisher.publish (message, DeliveryMode.PERSISTENT, 8, 10000); //Pub-Sub

queueSender.send(message,DeliveryMode.PERSISTENT, 8, 10000);//P2P

??????這個代碼片斷,有兩種消息模型,映射遞送方式是持久的,優先級為加快型,生存周期是10000 (以毫秒度量)。如果生存周期設置為零,這則消息將永遠不會過期。當消息需要時間限制否則將使其無效時,設置生存周期是有用的。

七、JMS提供者

??????要使用Java消息服務,你必須要有一個JMS提供者,管理會話和隊列。既有開源的提供者也有專有的提供者。

開源的提供者包括:

Apache ActiveMQ
JBoss 社區所研發的 HornetQ
Joram
Coridan的MantaRay
The OpenJMS Group的OpenJMS

專有的提供者包括:

BEA的BEA WebLogic Server JMS
TIBCO Software的EMS
GigaSpaces Technologies的GigaSpaces
Softwired 2006的iBus
IONA Technologies的IONA JMS
SeeBeyond的IQManager(2005年8月被Sun Microsystems并購)
webMethods的JMS+ -
my-channels的Nirvana
Sonic Software的SonicMQ
SwiftMQ的SwiftMQ
IBM的WebSphere MQ

總結

以上是生活随笔為你收集整理的【JMS】JMS详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。