目錄
?一、創(chuàng)建項目
二、創(chuàng)建核心類
?? 1、?編寫交換機類,Exchange
?? 2、編寫存儲消息的隊列,MSGQueue
?? 3、編寫綁定類,binding
?? 4、編寫消息,Message
?一、創(chuàng)建項目
?
二、創(chuàng)建核心類
代碼解釋主要在注釋上面,注意一下注釋
核心類主要是在服務器模塊中的。?
主要是以下幾個類
*?交換機 exchange
* 隊列 queue
* 綁定 binding?
* 消息message
?? 1、?編寫交換機類,Exchange
首先編寫一個交換機類型的類,ExchangeType
是一個枚舉類型。
public enum ExchangeType {
DIRECT(0),
FANOUT(1),
TOPIC(2);
private final int type;
private ExchangeType(int type){
this.type = type;
}
}
下面我這里直接用了Lombok的@Data組合注解注解代替了getter和setter方法,不了解的可以直接generate生產(chǎn)getter和setter方法,然后
關(guān)于Lombok不理解的可以參考SpringBoot日志文件_??藿香正氣水的博客-CSDN博客,使用需要另外在pom.xml文件添加Lombok依賴
/*
* 表示一個交換機
* */
@Data
public class Exchange {
// 此處使用name,來作為交換機的身份標識(是唯一的)
private String name;
// 交換機類型:DIRECT,FANOUT,TOPIC
// 使用枚舉類型來表示
private ExchangeType type = ExchangeType.DIRECT;
// 表示該交換機是否要持久化存儲,true表示需要持久化;false表示不必持久化
// 有的數(shù)據(jù)是需要持久化存儲的,有的不要。所以設置一個開關(guān),
// 用戶在使用的時候就可以選擇是否真的需要持久化操作
private boolean durable = false;
}
?? 2、編寫存儲消息的隊列,MSGQueue
/*
* 表示一個存儲消息的隊列
* MSG => Message
* */
public class MSGQueue {
// 表示隊列的身份標識
private String name;
// 標識隊列是否持久化,true標識持久化保存,false標識不持久化
private boolean durable;
}
?? 3、編寫綁定類,binding
/*
* 表示隊列和交換機之間的關(guān)聯(lián)關(guān)系
* */
@Data
public class Binding {
// binding依附于Exchange和Queue
// binding和交換機和隊列有關(guān),所以就需要定義這兩個name
private String exchangeName;
private String queueName;
// bindingKey,匹配了才能綁定
private String bindingKey;
}
?? 4、編寫消息,Message
?主要包含兩個部分:
? ? ? ? * 屬性部分
????????????????關(guān)于屬性部分,創(chuàng)建一個BasicProperties類,編寫message的屬性:
? ? ? ? ? ? ? ? ? ? ? ? 關(guān)于三種交換機機型,參考項目實戰(zhàn) — 消息隊列(1) {需求分析}_??藿香正氣水的博客-CSDN博客
@Data public class BasicProperties { // 消息的唯一身份標識, // 此處要保證id唯一性,使用UUID來作為messageif private String messageId; // 消息上帶有的內(nèi)容,和bindingKey做匹配 // 如果當前的交換機型是DIRECT,此時roitingkey就標識要轉(zhuǎn)發(fā)的隊列名 // 如果當前的交換機型是FANOUT,此時roitingkey就無意義 // 如果當前的交換機型是TOPIC,此時roitingkey就要和bindingKey做匹配,符合要求才能轉(zhuǎn)發(fā) private String routingKey; // 這個屬性表示消息是否要持久化,1標識不持久化 ,2標識持久化 private int deliverMode = 1; }
? ? ? ? * 正文部分
????????????
/*
* 表示一個要傳遞的消息
* 主要包含兩個部分,一個屬性部分,一個正文部分
* 屬性部分BasicProperties
* 正文部分byte[]
* * 此處的Message是需要能夠在網(wǎng)絡中傳輸?shù)?還要寫入到文件中
* 所以需要針對Message進行序列化和反序列化,使用標準庫自帶的序列化/反序列化操作
* */
@Data
public class Message implements Serializable { //實現(xiàn)該接口,就能實現(xiàn)序列化/反序列化,不需要重寫其中的任何方法
private BasicProperties basicProperties;
private byte[] body;
// 下面是輔助性屬性
// Message后續(xù)會存儲到文件中(持久化)
// 一個文件中會存儲很多消息,
// 消息的具體位置使用下面的兩個偏移量來進行表示
// [offsetBegin,offsetEnd)
// 這兩個屬性,主要是為了讓內(nèi)存中的Message對象,能夠快速的找到對應的硬盤上的Message的位置
// 所以并不需要被序列化保存到文件中,該消息一旦被寫入到文件之后,所有消息就固定了,并不需要被單獨存儲
// 加上transient這兩個屬性就不會被序列化
private transient long offsetBegin = 0; //消息數(shù)據(jù)的開頭距離文件開頭的位置偏移(字節(jié))
private transient long offsetEnd = 0; //消息數(shù)據(jù)的結(jié)尾距離文件開始的位置偏移(字節(jié))
// 使用這個屬性表示該消息在文件中是否是有效的消息(邏輯刪除)
// 0x1表示有效,0x0表示無效
// 邏輯刪除就是,刪除數(shù)據(jù)不是真的刪除,而是把需要刪除的信息標記成無效
private byte isValid = 0x1;
// 創(chuàng)建一個工廠方法,讓工廠方法幫我們封裝以下Message對象的過程
// 該方法創(chuàng)建的Message對象,會自動生成唯一的MessageId
// 如果routingKey和basicProperties里面的routingKey沖突,以外面的為主
public static Message createMessageWithId(String routingKey,BasicProperties basicProperties,byte[] body){
Message message = new Message();
if(basicProperties != null){
message.setBasicProperties(basicProperties);
}
// 此處生成的MessageId以M-作為前綴
// 為了和后續(xù)別的uid進行區(qū)分
message.setMessageId("M-"+ UUID.randomUUID());
message.basicProperties.setRoutingKey(routingKey);
message.body = body;
// 此處主要是把消息和body和屬性設置出來,是Message的核心內(nèi)容
// 其他的offsetBegin等是在消息持久化的時候才會用到
return message;
}
// 下面設置一些getter和Setter方法拿到
public String getMessageId(){
return basicProperties.getMessageId();
}
public void setMessageId(String messageId){
basicProperties.setMessageId(messageId);
}
// routingKey讓消息和bindingKey做匹配
public String getRoutingKey(){
return basicProperties.getRoutingKey();
}
public void setRoutingKey(String routingKey){
basicProperties.setRoutingKey(routingKey);
}
// deliverMode是為了判斷該消息是否要持久化
public int getDeliverMode(){
return basicProperties.getDeliverMode();
}
public void setDeliverMode(int mode){
basicProperties.setDeliverMode(mode);
}
}
2023-7-31
修改:binding類中,exchangename => exchangeName
?2023-8-06文章來源:http://www.zghlxwxcb.cn/news/detail-618971.html
修改:Message類中,getMessage() => getMessageId()文章來源地址http://www.zghlxwxcb.cn/news/detail-618971.html
到了這里,關(guān)于項目實戰(zhàn) — 消息隊列(2){創(chuàng)建核心類}的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!