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