先看概念
activemq是JMS消息通信規(guī)范的一個實現∑ぃ總的來說,消息規(guī)范里面定義最常見的幾種消息通信模式主要有發(fā)布-訂閱卢鹦、點對點這兩種臀脏。另外,通過結合這些模式的具體應用冀自,我們在處理某些應用場景的時候也衍生出來了一種請求應答的模式揉稚。
JMS主要的幾個步驟如下:
- 獲得JMS connection factory. 通過我們提供特定環(huán)境的連接信息來構造factory。
- 利用factory構造JMS connection
- 啟動connection
- 通過connection創(chuàng)建JMS session.
- 指定JMS destination.
- 創(chuàng)建JMS producer或者創(chuàng)建JMS message并提供destination.
- 創(chuàng)建JMS consumer或注冊JMS message listener.
- 發(fā)送和接收JMS message.
- 關閉所有JMS資源熬粗,包括connection, session, producer, consumer等搀玖。
解釋上面
ConnectionFactory
創(chuàng)建Connection對象的工廠,針對兩種不同的jms消息模型驻呐,分別有QueueConnectionFactory和TopicConnectionFactory兩種灌诅。可以通過JNDI來查找ConnectionFactory對象含末。Destination
Destination的意思是消息生產者的消息發(fā)送目標或者說消息消費者的消息來源猜拾。對于消息生產者來說,它的Destination是某個隊列(Queue)或某個主題(Topic);對于消息消費者來說佣盒,它的Destination也是某個隊列或主題(即消息來源)挎袜。所以,Destination實際上就是兩種類型的對象:Queue肥惭、Topic可以通過JNDI來查找Destination盯仪。Connection
Connection表示在客戶端和JMS系統(tǒng)之間建立的鏈接(對TCP/IP socket的包裝)。Connection可以產生一個或多個Session务豺。跟ConnectionFactory一樣磨总,Connection也有兩種類型:QueueConnection和TopicConnection。Session
Session是我們操作消息的接口笼沥◎窖啵可以通過session創(chuàng)建生產者、消費者奔浅、消息等馆纳。Session提供了事務的功能。當我們需要使用session發(fā)送/接收多個消息時汹桦,可以將這些發(fā)送/接收動作放到一個事務中鲁驶。同樣,也分QueueSession和TopicSession舞骆。消息生產者
消息生產者由Session創(chuàng)建钥弯,并用于將消息發(fā)送到Destination径荔。同樣,消息生產者分兩種類型:QueueSender和TopicPublisher脆霎∽艽Γ可以調用消息生產者的方法(send或publish方法)發(fā)送消息。消息消費者
消息消費者由Session創(chuàng)建睛蛛,用于接收被發(fā)送到Destination的消息鹦马。兩種類型:QueueReceiver和TopicSubscriber∫渖觯可分別通過session的createReceiver(Queue)或createSubscriber(Topic)來創(chuàng)建荸频。當然鞠鲜,也可以session的creatDurableSubscriber方法來創(chuàng)建持久化的訂閱者卢厂。MessageListener
消息監(jiān)聽器。如果注冊了消息監(jiān)聽器敷待,一旦消息到達场仲,將自動調用監(jiān)聽器的onMessage方法遇绞。EJB中的MDB(Message-Driven Bean)就是一種MessageListener。
兩種模式
1.發(fā)布訂閱模式
客戶端將消息發(fā)送到主題燎窘。多個發(fā)布者將消息發(fā)送到Topic,系統(tǒng)將這些消息傳遞給多個訂閱者。
- 每個消息可以有多個消費者蹄咖。
- 發(fā)布者和訂閱者之間有時間上的依賴性褐健。針對某個主題(Topic)的訂閱者,它必須創(chuàng)建一個訂閱者之后澜汤,才能消費發(fā)布者的消息蚜迅,而且為了消費消息,訂閱者必須保持運行的狀態(tài)俊抵。
- 為了緩和這樣嚴格的時間相關性谁不,JMS允許訂閱者創(chuàng)建一個可持久化的訂閱。這樣徽诲,即使訂閱者沒有被激活(運行)刹帕,它也能接收到發(fā)布者的消息。
2.P2P模式
在p2p里一個queue只有一個發(fā)送者和一個接收者谎替。如果你希望發(fā)送的每個消息都應該被成功處理的話偷溺,那么你需要P2P模式。
- 每個消息只有一個消費者(Consumer)(即一旦被消費钱贯,消息就不再在消息隊列中)挫掏。
- 發(fā)送者和接收者之間在時間上沒有依賴性,也就是說當發(fā)送者發(fā)送了消息之后秩命,不管接收者有沒有正在運行尉共,它不會影響到消息被發(fā)送到隊列褒傅,當有新的接收者出現時,此消息被消費袄友。
- 接收者在成功接收消息之后需向隊列應答成功殿托。
要點:
topic模式:每個消息可以有多個消費者。訂閱者必須在創(chuàng)建后杠河,并保持運行的狀態(tài)碌尔。才能消費發(fā)布者的消息。
queue模式:只有一個發(fā)送者和一個接收者券敌。發(fā)送者發(fā)送了消息之后唾戚,不管接收者有沒有正在運行,消息被發(fā)送到隊列待诅,當有新的接收者出現時叹坦,此消息被消費。