統一硬盤操作
- 創建出實例
- 封裝交換機的操作
- 封裝隊列的操作
- 封裝綁定的操作
- 封裝消息的操作
- 總的完整代碼:
我們之前已經使用了數據庫去管理交換機,綁定,隊列
還使用了數據文件去管理消息
此時我們就搞一個類去把上述兩個部分都整合在一起,對上層提供統一的一套接口
在項目文件中的datacenter這個包下面創建一個新的類:DiskDataCenter
使用這個類來管理所有的硬盤上的數據:
一個是數據庫:交換機,綁定,隊列
一個是數據文件:消息
上層邏輯如果需要操作硬盤,統一都通過這個類來使用(上層代碼不在乎當前數據是在數據文件中還是數據庫中)
創建出實例
我們先去創建出數據庫實例和數據文件的實例:
//把數據庫實例創建出來 private DataBaseMapper dataBaseMapper = new DataBaseMapper(); //把數據文件的實力創建出來 private MessageFileManager messageFileManager = new MessageFileManager();
接著對這兩個實例進行初始化:
//初始化方法:針對上面的兩個實例進行初始化 public void init(){ dataBaseMapper.init(); //下面這個是空的方法,后續要擴展再寫 messageFileManager.init(); }
封裝交換機的操作
我們這里是使用剛剛創建出來的數據庫的實例dataBaseMapper去封裝了插入交換機,刪除交換機,查詢交換機:
//封裝交換機的三個操作 //插入交換機 public void insertExchange(Exchange exchange){ dataBaseMapper.insertExchange(exchange); } //刪除交換機 public void deleteExchange(String exchangeName){ dataBaseMapper.deleteExchange(exchangeName); } //查詢交換機 public List<Exchange> selectAllExchanges(){ return dataBaseMapper.selectAllexchanges(); }
封裝隊列的操作
我們這里是使用剛剛創建出來的數據庫的實例dataBaseMapper去封裝了插入隊列,刪除隊列,查詢隊列:
//封裝隊列的三個操作 //插入隊列 public void insertQueue(MSGQueue queue){ dataBaseMapper.insertQueue(queue); } //刪除隊列 public void deleteQueue(String queueName){ dataBaseMapper.deleteQueue(queueName); } //查詢隊列 public List<MSGQueue> selectAllQueue(){ return dataBaseMapper.selectAllQueues(); }
封裝綁定的操作
我們這里是使用剛剛創建出來的數據庫的實例dataBaseMapper去封裝了插入綁定,刪除綁定,查詢綁定:
//封裝綁定的三個操作 //插入綁定 public void insertBinding(Binding binding){ dataBaseMapper.insertBinding(binding); } //刪除綁定 public void deleteBinding(Binding binding){ dataBaseMapper.deleteBinding(binding); } //查詢綁定 public List<Binding> selectAllBindings(){ return dataBaseMapper.selectAllBindings(); }
封裝消息的操作
我們這里是使用剛剛創建出來的數據文件的實例messageFileManager去封裝了發送消息,刪除消息,加載隊列中的所有消息:
//封裝消息操作 //發送消息 public void sendMessage(MSGQueue queue, Message message) throws IOException, MqException { messageFileManager.sendMessage(queue,message); } //刪除消息 //考慮刪除了之后,多了一個無效消息,看看是不是要進行垃圾回收 public void deleteMessage(MSGQueue queue, Message message) throws IOException, ClassNotFoundException, MqException { messageFileManager.deleteMessage(queue,message); if(messageFileManager.checkGC(queue.getName())){ messageFileManager.gc(queue); } } //加載隊列中的所有消息public LinkedList<Message> loadAllMessageFromQueue(String queueName) throws IOException, MqException, ClassNotFoundException { return messageFileManager.loadAllMessageFromQueue(queueName); }
總的完整代碼:
這個DiskDataCenter類的總代碼如下所示:
package org.example.mqtexxt.mqserver.datacenter; import org.example.mqtexxt.common.MqException;
import org.example.mqtexxt.mqserver.core.Binding;
import org.example.mqtexxt.mqserver.core.Exchange;
import org.example.mqtexxt.mqserver.core.MSGQueue;
import org.example.mqtexxt.mqserver.core.Message; import java.io.IOException;
import java.util.LinkedList;
import java.util.List; /*
使用這個類來管理所有的硬盤上的數據:
一個是數據庫:交換機,綁定,隊列
一個是數據文件:消息
上層邏輯如果需要操作硬盤,統一都通過這個類來使用(上層代碼不在乎當前數據是在數據文件中還是數據庫中) */public class DiskDataCenter { //把數據庫實例創建出來 private DataBaseMapper dataBaseMapper = new DataBaseMapper(); //把數據文件的實力創建出來 private MessageFileManager messageFileManager = new MessageFileManager(); //初始化方法:針對上面的兩個實例進行初始化 public void init(){ dataBaseMapper.init(); //下面這個是空的方法,后續要擴展再寫 messageFileManager.init(); } //封裝交換機的三個操作 //插入交換機 public void insertExchange(Exchange exchange){ dataBaseMapper.insertExchange(exchange); } //刪除交換機 public void deleteExchange(String exchangeName){ dataBaseMapper.deleteExchange(exchangeName); } //查詢交換機 public List<Exchange> selectAllExchanges(){ return dataBaseMapper.selectAllexchanges(); } //封裝隊列的三個操作 //插入隊列 public void insertQueue(MSGQueue queue){ dataBaseMapper.insertQueue(queue); } //刪除隊列 public void deleteQueue(String queueName){ dataBaseMapper.deleteQueue(queueName); } //查詢隊列 public List<MSGQueue> selectAllQueue(){ return dataBaseMapper.selectAllQueues(); } //封裝綁定的三個操作 //插入綁定 public void insertBinding(Binding binding){ dataBaseMapper.insertBinding(binding); } //刪除綁定 public void deleteBinding(Binding binding){ dataBaseMapper.deleteBinding(binding); } //查詢綁定 public List<Binding> selectAllBindings(){ return dataBaseMapper.selectAllBindings(); } //封裝消息操作 //發送消息 public void sendMessage(MSGQueue queue, Message message) throws IOException, MqException { messageFileManager.sendMessage(queue,message); } //刪除消息 //考慮刪除了之后,多了一個無效消息,看看是不是要進行垃圾回收 public void deleteMessage(MSGQueue queue, Message message) throws IOException, ClassNotFoundException, MqException { messageFileManager.deleteMessage(queue,message); if(messageFileManager.checkGC(queue.getName())){ messageFileManager.gc(queue); } } //加載隊列中的所有消息public LinkedList<Message> loadAllMessageFromQueue(String queueName) throws IOException, MqException, ClassNotFoundException { return messageFileManager.loadAllMessageFromQueue(queueName); }
}
DiskDataCenter類主要就是去封裝了消息的基本操作,其實也就是把之前的MessageFileManager類和DataBaseMapper類的關鍵方法統一進行了封裝操作
后續的代碼中,上層代碼就不用直接去調用MessageFileManager類和DataBaseMapper類了
上層代碼而是直接去調用這個DiskDataCenter類即可