Java之JMS
一:JMS簡介
 ??JMS即Java消息服務(Java Message Service),是一個Java平臺定義的關于面向消息中間件的API,用于在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。JMS是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支持。
 ??JMS允許應用程序組件基于JavaEE平臺創建、發送、接收和讀取消息。它使分布式通信耦合度更低,消息服務更加可靠。
二:常用術語
三:JMS基本概念及原理解析
1、基本概念
 JMS是Java的消息服務,JMS的客戶端之間可以通過JMS服務進行異步的消息傳輸。
2、體系架構
 JMS由以下元素組成
 1.JMS提供者
 連接面向消息中間件的JMS的接口的實現。無關語言,可以是非Java的。 
 2.JMS客戶
 生產或消費消息的基于Java的應用程序或對象
 3.JMS生產者
 創建并發送消息的JMS客戶
 4.JMS消費者
 接收消息的JMS客戶
 5.JMS隊列
 一個容納等待被消費的消息的區域。隊列的特性,按順序,先進先出,消費后會移除隊列
 6.JMS主題
 一種支持發送消息給多個訂閱者的機制
3、JMS消息模型
 1. P2P,Point-to-Point
 2. Pub/Sub,Publish/Subscribe
4、P2P詳解
 1.P2P介紹
 
 2.P2P的特點
- 每條消息只能成功消費一次(即一旦被消費,消息就不再在消息隊列中)
 - 提供者、消費者解耦,無論有沒有消費者,都不影響提供者發送消息到消息隊列
 - 每條消息僅會被一個消費者消費。可能會有多個消費者在監聽同一個隊列,但是隊列中的消息僅會被一個消費者消費
 - 消息存在先后順序。隊列的特性,先進先出
 - 消費者在成功接受消息之后需向隊列應答成功
 
5、Pub/Sub(發布/訂閱 模式)
 1.Pub/Sub模式圖
 
 2.Pub/Sub的特點
- 每個消息可以有多個消費者
 - 發布者和訂閱者之間有時間上的依賴性。針對某個主題的訂閱者,它必須創建一個訂閱者之后,才能消費發布者的消息,而且為了消費消息,訂閱者必須保持運行的狀態
 - 為了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運行),它也能接收到發布者的消息
 - 每條消息都會傳送給稱為訂閱者的多個消息消費者。訂閱者有許多類型,包括持久型、非持久型和動態型
 - 發布者通常不會知道、也意識不到哪一個訂閱者正在接收主題消息
 - 消息被推送給消費者,這意味著消息會傳送給消費者,而無須請求
 
6、消息的消費
 JMS中,消息的產生和消費是異步的。有兩種方式消費消息:
 1.同步:訂閱/消費者調用receive方法來接收消息,receive方法在接收到消息/超時之前,一直阻塞
 2.異步:訂閱/消費者注冊為消息監聽者。消息到達后,系統自動調用監聽器的onMessage方法
7、JMS應用程序接口
 1.ConnectionFactory接口(連接工廠)
 創建Connection對象的工廠,根據消息類型的不同,分為QueueConnectionFactory、TopicConnectionFactory兩種。可以通過JNDI來查找ConnectionFactory
 2.Destination接口
 Destination是包裝了消息目標標識符的對象,消息目標指的是消息發布和接收的地點(隊列、主題)。可以通過JNDI查找Destination 
 3.Connection接口
 Connection表示在客戶端和JMS系統之間建立的連接(對TCP/IP socket的包裝)
 Connection可以產生一個或多個的Session。分為QueueConnection、TopicConnection
 4.Session接口
 Session是我們操作消息的接口,表示一個單線程的上下文,用于發送和接收消息。由于會話是單線程的,所以消息是連續的,就是說消息是按照發送的順序一個一個接收的。
  可以通過session創建生產者、消費者、消息等。Session提供了事務的功能。當我們需要使用session發送/接收多個消息時,可以將這些發送/接收動作放到一個事務中。
  同樣,也分QueueSession和TopicSession。
  5.MessageProducer 接口(消息的生產者)
  消息生產者由Session創建,并用于將消息發送到Destination。消費者可以同步地(阻塞模式),或異步(非阻塞)接收隊列和主題類型的消息。
  同樣,消息生產者分兩種類型:QueueSender和TopicPublisher。可以調用消息生產者的方法(send或publish方法)發送消息。
  6.MessageConsumer 接口(消息消費者)
  消息消費者由Session創建,用于接收被發送到Destination的消息。兩種類型:QueueReceiver和TopicSubscriber。
  可分別通過session的createReceiver(Queue)或createSubscriber(Topic)來創建。
  當然,也可以session的creatDurableSubscriber方法來創建持久化的訂閱者。
  7.Message 接口(消息)
  是在消費者和生產者之間傳送的對象,也就是說從一個應用程序創送到另一個應用程序。一個消息有三個主要部分:
  1、消息頭(必須):包含用于識別和為消息尋找路由的操作設置。
  2、一組消息屬性(可選):包含額外的屬性,支持其他提供者和用戶的兼容。可以創建定制的字段和過濾器(消息選擇器)。
  3、一個消息體(可選):允許用戶創建五種類型的消息(文本消息,映射消息,字節消息,流消息和對象消息)。消息接口非常靈活,并提供了許多方式來定制消息的內容。
 消息接口非常靈活,并提供了許多方式來定制消息的內容。
  8.MessageListener
  消息監聽器。如果注冊了消息監聽器,一旦消息到達,將自動調用監聽器的onMessage方法。
  EJB中的MDB(Message-Driven Bean)就是一種MessageListener。
四:JMS的提供者實現
使用Java消息服務,你必須要有一個JMS提供者,管理會話和隊列。現在既有開源的提供者也有專有的提供者。
 開源的提供者包括:Apache ActiveMQ、Kafka、WebMethods、阿里的RocketMQ等
參考:
 https://www.cnblogs.com/chenpi/archive/2016/06/06/5559349.html
 http://www.cnblogs.com/molao-doing/articles/6557305.html
總結
                            
                        - 上一篇: 减肥的人可以吃榴莲吗
 - 下一篇: Java之JMX