JMS Java消息服务(Java Message Service)
JMS
在一些場景下RPC的同步方式可能不太適合業務邏輯的處理,并且這種方式在某些場景下會導致業務的緊耦合。
基于異步交互模型的JMS解決了RPC產生的緊耦合問題,它提供了一個可以通過網絡訪問的抽象消息隊列。
結構
JMS應用由以下幾個部分組成:
- A JMS provider: A messaging system that implements the JMS specification.
- JMS clients: Java applications that send and receive messages.
- Messages: Objects that are used to communicate information between JMS clients.
- Administered objects: Preconfigured JMS objects that are created by an administrator for the use of JMS clients.
消息傳輸模型
JMS支持兩種消息模型
point to point (queuing)
publish-subscribe (topic)
消息體組成
在JMS應用中,一個消息由三部分組成:header,properties,body。
- header(required) 消息頭,必填,包含了路由信息和標識信息。
- properties(optional) 屬性,可選,由key-value對構成,可以看做是對header的擴展。
- body(optional) 消息體,可選,包含真正要傳遞的數據。JMS規范定義了JMS Provider必須要支持的六種消息類型:
- Message:沒有消息正文的消息。
- StreamMessage:包含java基礎類型的流,按順序讀寫。
- MapMessage:消息體為鍵值對,不定義順序。
- TextMessage:文本消息,消息體為字符串,例如XML消息。
- ObjectMessage:消息體為一個序列化的java對象。
- ByteMessage:字節消息,正文為未解釋的字節。
消息的生產和消費-編程模型
點對點隊列API
發布-訂閱API
消息的生產
使用JNDI找到ConnectionFactory對象,或者直接實例化一個ConnectionFactory,最終得到一個QueueConnectionFactory或者TopicConnectionFactory的實例,通過這個實例為生產者創建連接。
使用JNDI查找連接工廠對象:
直接實例化連接工廠:
ConnectionFactory connFactory = new com.sun.messaging.ConnectionFactory();使用ConnectionFactory創建連接Connection。
Connection connection = connFactory.createConnection();注意:調用結束后調用connection.close()關閉所有已經創建的連接。
使用Connection對象創建Session。這些Session將一組發送和接收合并到一個原子單元內,并提供事務上下文。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);createSession()方法有兩個參數:第一個表示session是否使用事務,第二個表示session在成功收到消息后自動確認。
使用JNDI查找Destination對象,或者直接實例化Destination。
客戶端使用Destination對象來指定它消費的消息的來源或者它生產的消息的目標。在point to point消息傳遞中,Destination為Queue,在消息傳遞的發布/訂閱模型中,為Topic。
JNDI方式:
直接實例化:
Queue q = new com.sun.messaging.Queue("world");通過Session和Destination創建MessageProducer,MessageProducer用來發送消息。下面的代碼中沒有說明Destination的使用,但是每一個消息必須指定Destination。
MessageProducer producer = session.createProducer(SomeQueue OR SomeTopic);完成生產者創建之后,就可以使用生產者發送消息
producer.send(message);消息的消費
1.2.3.4 同Producer
消息的消費分為同步消費和異步消費兩種。同步消費是使用receive()方法,而異步消費則使用消息監聽器,MessageListner。
通過Session和Destination創建MessageConsumer,MessageProducer用來接收消息。
MessageConsumer consumer = session.createConsumer(SomeQueue or SomeTopic);如果是一個發布/訂閱模式的消費者,可以使用Session.createDurableSubscriber()創建一個持久的topic訂閱者。
和Producer同樣,創建之后可以使用其功能,不同的是MessageConsumer不是主動模式,而是被動模式。在啟動連接之前,消息不會傳遞,必須先啟動連接,才能接收消息。
connection.start(); Message msg = consumer.receive();consumer.receive()可傳入一個long型參數來指定超時時間,單位是ms。
注意:使用receive()方法是同步消費,異步消費需要使用消息監聽器。
如果需要異步通信,需要實例化MessageListener并在MessageConsumer中注冊這個監聽器。
MessageListener listener = new MyListener(); consumer.setMessageListener(listener);為了避免丟失消息,注冊監聽器后,調用連接的start()方法,當消息開始傳遞,JMS會自動調用監聽器的onMessage()接收消息。
轉載于:https://www.cnblogs.com/AaronCui/p/10445436.html
總結
以上是生活随笔為你收集整理的JMS Java消息服务(Java Message Service)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小微商户获取申请状态
- 下一篇: python3 替换字符串中指定位置字符