前幾天組長面試別人的時候問了些關于JMS的問題法挨,后來順便問了我一下因妇。hmmm沒接觸過這技術當然是一臉懵逼,所以索性花了點時間上網(wǎng)搜了一下相關的內(nèi)容然后自己總結(jié)一下。
什么是JMS骚灸?
JMS是Java消息中間件服務的應用程序接口,用于Java平臺中應用程序之間的異步通信慌植。到這里想提一下MQ甚牲,MQ是應用程序?qū)贸绦蛑g的通信方法,是遵循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ā)送者和接收者沒有依賴關系栋盹。接收者接收成功有反饋信息。
如果希望每個消息都被成功處理應該使用該模型敷矫。
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ā)人員提供了查找和訪問各種命名和目錄服務的通用、統(tǒng)一接口缝呕。
2.Connection
發(fā)送端和接收端之間建立的連接损谦,根據(jù)消息模型不同可以使用QueueConnection或者TopicConnection。用于創(chuàng)建Session岳颇。
3.Session
操作消息的接口÷妫可以通過session創(chuàng)建生產(chǎn)者话侧、消費者、消息等等闯参。提供事務功能用于發(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ù)流消息