前幾天組長面試別人的時候問了些關(guān)于JMS的問題,后來順便問了我一下。hmmm沒接觸過這技術(shù)當然是一臉懵逼,所以索性花了點時間上網(wǎng)搜了一下相關(guān)的內(nèi)容然后自己總結(jié)一下。
什么是JMS?
JMS是Java消息中間件服務(wù)的應(yīng)用程序接口,用于Java平臺中應(yīng)用程序之間的異步通信。到這里想提一下MQ,MQ是應(yīng)用程序?qū)?yīng)用程序之間的通信方法,是遵循AMQP協(xié)議的具體實現(xiàn)和產(chǎn)物。
如何消費JMS產(chǎn)生的消息?
JMS中消息的產(chǎn)生和消費是異步的。但是消息被消費的方式有2種。
1.同步的消息消費方式。
消息接收者調(diào)用receive方法接收信息,在接到消息之前(或者超時前)一直阻塞。
2.異步的消息消費方式。
消息接收者注冊消息監(jiān)聽器,消息到達后調(diào)用監(jiān)聽器的onMessage方法。
消息消費模型
1.點對點模型
每個消息只有一個接收者,發(fā)送者和接收者沒有依賴關(guān)系。接收者接收成功有反饋信息。
如果希望每個消息都被成功處理應(yīng)該使用該模型。

2.發(fā)布/訂閱模型
每個消息可以有多個接收者,有時間依賴,必須訂閱之后才能消費消息。
因此訂閱者必須要一直處于在線狀態(tài)。
允許創(chuàng)建持久化訂閱,使沒有激活的訂閱者也能收到消息。

JMS對象模型

一般一個JMS對象模型包括以下幾個元素。
1.ConnectionFactory?
用于創(chuàng)建發(fā)送端和接收端之間連接的工廠類。針對不同的消息模型有 QueueConnectionFactory和TopicConnectionFactory,也可以在Tomcat的context.xml中配置然后通過JNDI來查找。
PS:JNDI是一個標準規(guī)范,類似JDBC,JMS等規(guī)范,為開發(fā)人員提供了查找和訪問各種命名和目錄服務(wù)的通用、統(tǒng)一接口。
2.Connection
發(fā)送端和接收端之間建立的連接,根據(jù)消息模型不同可以使用QueueConnection或者TopicConnection。用于創(chuàng)建Session。
3.Session
操作消息的接口??梢酝ㄟ^session創(chuàng)建生產(chǎn)者、消費者、消息等等。提供事務(wù)功能用于發(fā)送/接收多個消息。也分QueueSession和TopicSession。
4.Sender
由Sessoin創(chuàng)建,將消息發(fā)送到destination。根據(jù)消息模型不同可以使用QueueSender或者TopicPublisher。
5.Receiver
由Session創(chuàng)建,接收Destination發(fā)來的信息。根據(jù)消息模型不同可以使用QueueReceiver或者TopicSubscriber。可以通session的createDurableSubscriber方法來創(chuàng)建持久化的訂閱者。
6.Destinatoin
消息生產(chǎn)者的發(fā)送目標或者消息接受者的消息來源。 實際上就是Queue、Topic的對象。
7.MessageListener
消息監(jiān)聽器。如果注冊監(jiān)聽器,一旦消息達到就自動調(diào)用onMessage方法。
JMS提供五種不同的消息正文格式用于消息的發(fā)送以及接收。
1.StreamMessage -> 數(shù)據(jù)流消息
2.MapMessage -> 鍵值對消息
3.TextMessage -> 字符串消息
4.ObjectMessage -> 序列化對象消息
5.BytesMessage ->未解釋字節(jié)數(shù)據(jù)流消息