日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JMS Java消息服务(Java Message Service)

發布時間:2025/4/16 java 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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查找連接工廠對象:

    Context ctx = new InitialContext(); ConnectionFactory cf1 =(ConnectionFactory)ctx.lookup("jms / QueueConnectionFactory"); ConnectionFactory cf2 = (ConnectionFactory) ctx.lookup("/jms/TopicConnectionFactory");

    直接實例化連接工廠:

    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方式:

    Destination dest = (Queue) ctx.lookup("jms/SomeQueue");

    直接實例化:

    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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。