是什麼
JavaEE
JavaEE是一套使用Java進行企業級應用開發的大家一致遵循的13個核心規範工業標準。JavaEE平臺提供了一個基於組件的方法來加快設計,開發。裝配及部署企業應用程序。
1,JDBC(Java Databease)數據庫連接
2,JNDI(Java Naming and Directory Interfaces)Java的命令和目錄接口
3,EJB(Enterprise JavaBean)
4,RMI(Remote Method Invoke)遠程方法調用
5,Java IDL(Interface Description Language)/CORBA(Common Object Broker Architecture)接口定義語言/共用對象請求代理程序體系結構
6,JSP(Java Server Page)
7,Servlet
8,XML(Extensible Markup Language)可標記白標記語言
9,JMS(Java Message Service)Java消息服務
10,JTA(Java Transaction API)Java事務API
11,JTS(Java Transaction Service)Java事務服務
12,JavaMail
13,JAF(JavaBean Activation Framework)
JMS
Java Message Service(Java消息服務是JavaEE中的一個技術
什麼是Java消息服務
Java消息服務指的是兩個應用程序之間進行異步通信的API,它爲標準協議和消息服務提供了一組通用接口,包括創建、發送、讀取消息等,用於支持Java應用程序開發。在JavaEE中,當兩個應用程序使用JMS進行通信時,它們之間不是直接相連的,而是通過一個共同的消息收發服務組件關聯起來以達到解耦/異步削峯的效果。
JMS的組成結構和特點
JMS Provider
實現JMS接口和規範的消息中間件,也就是我們說的MQ服務器
JMS Producer
消息生產者,創建和發送JMS消息的客戶端應用
JMS Consumer
消息消費者,接收和處理JMS消息的客戶端應用
JSM Message
消息頭
JMSDestination
消息發送的目的地,主要是指Queue和Topic
JMSDeliveryMode持久模式和非持久模式。一條持久性的消息:應該被傳送“一次僅僅一次”,這就意味着如果JMS提供者出現故障,該消息並不會丟失,它會在服務器恢復之後再次傳遞。一條非持久的消息:最多會傳遞一次,這意味着服務器出現故障,該消息將會永遠丟失。
JMSExpiration可以設置消息在一定時間後過期,默認是永不過期消息過期時間,等於Destination的send方法中的timeToLive值加上發送時刻的GMT時間值。如果timeToLive值等於0,則JMSExpiration被設爲0,表示該消息永不過期。如果發送後,在消息過期時間之後還沒有被髮送到目的地,則該消息被清除。
JMSPriority消息優先級,從0-9十個級別,0-4是普通消息5-9是加急消息。JMS不要求MQ嚴格按照這十個優先級發送消息但必須保證加急消息要先於普通消息到達。默認是4級。
JMSMessageID
唯一標識每個消息的標識由MQ產生。
消息體
封裝具體的消息數據
5種消息格式
TxtMessage
普通字符串消息,包含一個String
MapMessage
一個Map類型的消息,key爲Strng類型,而值爲Java基本類型
BytesMessage
二進制數組消息,包含一個byte[]
StreamMessage
Java數據流消息,用標準流操作來順序填充和讀取
ObjectMessage
對象消息,包含一個可序列化的Java對象
發送和接收的消息體類型必須一致對應
消息屬性
如果需要除消息字段以外的值,那麼可以使用消息屬性
識別/去重/重點標註等操作非常有用的方法
是什麼
JMS的可靠性
PERSISTENT:持久性
參數設置說明
非持久
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT)
非持久化:當服務器宕機,消息不存在。
持久
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT)
持久化:當服務器宕機,消息依然存在。
Queue默認是持久持久的Queue
演示MessageProducer messageProducer = session.createProducer(queue); //設置通過session創建出來的生產者生產的Queue消息爲持久性 messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
結論持久化消息這是隊列的默認傳遞模式,此模式保證這些消息只被傳送一次和成功使用一次。對於這些消息,可靠性是優先考慮的因素。可靠性的另一個重要方面是確保持久性消息傳送至目標後,消息服務在向消費者傳送它們之前不會丟失這些消息。
持久的Topic
代碼
先啓動定閱消費者再啓動定閱生產者
持久的發佈主題生產者
代碼
控制檯
訂閱者在線
訂閱者不在線
持久的定閱主題消費者
代碼
控制檯
訂閱者在線
訂閱者不在線
控制檯
類似微信公衆號訂閱發佈
Transaction:事務
producer提交時的事務
false
只要執行send,就進入到隊列中
關閉事務,那第2個簽收參數的設置需要有效
true
先執行send再執行commit,消息才被真正提交到隊列中
消息需要需要批量提交,需要緩衝處理
事務偏生產者/簽收偏消費者
代碼
生產者
消費者
Acknowledge:簽收
非事務
自動簽收(默認)
手動簽收
Session.CLIENT_ACKNOWLEDGE
客戶端調用acknowledge方法手動簽收
允許重複消息
事務
生產事務開啓,只有commit後才能將全部消息變爲已消費
消息生產者
代碼
控制檯
消息消費者
代碼
控制檯
簽收和事務的關係
JMS的點對點總結
JMS的發佈訂閱總結