訊息中介軟體MQ(三)JMS常識及簡單案例
1JMS概念 JMS即Java訊息服務(Java Message Service)應用程式介面,是一個Java平臺中關於面向訊息中介軟體(MOM)的API,用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。Java訊息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支援。
2JMS體系架構 JMS由以下元素組成。 2.1JMS提供者:連接面向訊息中介軟體的,JMS介面的一個實現。提供者可以是Java平臺的JMS實現,也可以是非Java平臺的面向訊息中介軟體的介面卡。 2.2JMS客戶:生產或消費基於訊息的Java的應用程式或物件。 2.3JMS生產者:建立併發送訊息的JMS客戶。 2.4JMS消費者:接收訊息的JMS客戶。 2.5JMS訊息:包括可以在JMS客戶之間傳遞的資料的物件 2.6JMS佇列:一個容納那些被髮送的等待閱讀的訊息的區域。與佇列名字所暗示的意思不同,訊息的接受順序並不一定要與訊息的傳送順序相同。一旦一個訊息被閱讀,該訊息將被從佇列中移走。 2.7JMS主題:一種支援傳送訊息給多個訂閱者的機制。
3JMS物件模型 3.1連線工廠。連線工廠(ConnectionFactory)是由管理員建立,並繫結到JNDI樹中。客戶端使用JNDI查詢連線工廠,然後利用連線工廠建立一個JMS連線。 3.2JMS連線。JMS連線(Connection)表示JMS客戶端和伺服器端之間的一個活動的連線,是由客戶端通過呼叫連線工廠的方法建立的。 3.3JMS會話。JMS會話(Session)表示JMS客戶與JMS伺服器之間的會話狀態。JMS會話建立在JMS連線上,表示客戶與伺服器之間的一個會話執行緒。 3.4JMS目的。JMS目的(Destination),又稱為訊息佇列,是實際的訊息源。 3.5JMS生產者和消費者。生產者(Message Producer)和消費者(Message Consumer)物件由Session物件建立,用於傳送和接收訊息。 3.6JMS訊息通常有兩種型別: ① 點對點(Point-to-Point)。在點對點的訊息系統中,訊息分發給一個單獨的使用者。點對點訊息往往與佇列(javax.jms.Queue)相關聯。 ② 釋出/訂閱(Publish/Subscribe)。釋出/訂閱訊息系統支援一個事件驅動模型,訊息生產者和消費者都參與訊息的傳遞。生產者釋出事件,而使用者訂閱感興趣的事件,並使用事件。該型別訊息一般與特定的主題(javax.jms.Topic)關聯。
4應用程式 4.1ConnectionFactory 介面(連線工廠) 使用者用來建立到JMS提供者的連線的被管物件。JMS客戶通過可移植的介面訪問連線,這樣當下層的實現改變時,程式碼不需要進行修改。管理員在JNDI名字空間中配置連線工廠,這樣,JMS客戶才能夠查詢到它們。根據訊息型別的不同,使用者將使用佇列連線工廠,或者主題連線工廠。 4.2Connection 介面(連線) 連線代表了應用程式和訊息伺服器之間的通訊鏈路。在獲得了連線工廠後,就可以建立一個與JMS提供者的連線。根據不同的連線型別,連線允許使用者建立會話,以傳送和接收佇列和主題到目標。 4.3Destination 介面(目標) 目標是一個包裝了訊息目標識別符號的被管物件,訊息目標是指訊息釋出和接收的地點,或者是佇列,或者是主題。JMS管理員建立這些物件,然後使用者通過JNDI發現它們。和連線工廠一樣,管理員可以建立兩種型別的目標,點對點模型的佇列,以及釋出者/訂閱者模型的主題。 4.4Session 介面(會話) 表示一個單執行緒的上下文,用於傳送和接收訊息。由於會話是單執行緒的,所以訊息是連續的,就是說訊息是按照發送的順序一個一個接收的。會話的好處是它支援事務。如果使用者選擇了事務支援,會話上下文將儲存一組訊息,直到事務被提交才傳送這些訊息。在提交事務之前,使用者可以使用回滾操作取消這些訊息。一個會話允許使用者建立訊息,生產者來發送訊息,消費者來接收訊息。 4.5MessageConsumer 介面(訊息消費者) 由會話建立的物件,用於接收發送到目標的訊息。消費者可以同步地(阻塞模式),或(非阻塞)接收佇列和主題型別的訊息。 4.6MessageProducer 介面(訊息生產者) 由會話建立的物件,用於傳送訊息到目標。使用者可以建立某個目標的傳送者,也可以建立一個通用的傳送者,在傳送訊息時指定目標。 4.7Message 介面(訊息) 是在消費者和生產者之間傳送的物件,也就是說從一個應用程式傳送到另一個應用程式。一個訊息有三個主要部分: 訊息頭(必須):包含用於識別和為訊息尋找路由的操作設定。 一組訊息屬性(可選):包含額外的屬性,支援其他提供者和使用者的相容。可以建立定製的欄位和過濾器(訊息選擇器)。 一個訊息體(可選):允許使用者建立五種型別的訊息(文字訊息,對映訊息,位元組訊息,流訊息和物件訊息)。 訊息介面非常靈活,並提供了許多方式來定製訊息的內容。
5 簡單案例 ConnectionFactory---->Connection—>Session—>Message Destination + Session------------------------------------>Producer Destination + Session------------------------------------>MessageConsumer 5.1先要得到ConnectionFactoy和Destination,這裡建立一個一對一的Queue作為Destination;
ConnectionFactory factory = new ActiveMQConnectionFactory(“vm://localhost”); Queue queue = new ActiveMQQueue(“testQueue”);
5.2用ConnectionFactory建立一個Connection, 再啟動這個Connection:
Connection connection = factory.createConnection(); connection.start();
5.3由Connection建立一個Session:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)
5.4建立Message了,這裡建立一個TextMessage。
Message message = session.createTextMessage(“Hello JMS!”);
5.5要想把剛才建立的訊息傳送出去,需要由Session和Destination建立一個訊息生產者:
MessageProducer producer = session.createProducer(queue);
5.4下面就可以傳送剛才建立的訊息了:
producer.send(message);
5.5訊息傳送完成之後,需要建立一個訊息消費者來接收這個訊息:
MessageConsumer comsumer = session.createConsumer(queue); Message recvMessage = comsumer.receive();
5.6訊息消費者接收到這個訊息之後,就可以得到它的內容:
System.out.println(((TextMessage)recvMessage).getText());