輪子項目--消息隊列的實現(3)

????????上一篇文章中我把一些關鍵的類以及表示出來,如何對這些類對應的對象進行管理呢?管理分為硬盤和內存上,硬盤又分為數據庫(管理交換機,隊列和綁定)和文件(管理消息),本文就是討論的數據庫上的管理。

? ? ? ? 此處為了使用更加方便,簡化環境,采用更加輕量的數據庫——SQLite,它是一個本地數據庫,相當于直接操作本地的硬盤文件。

? ? ? ? 當在idea中配置好SQLiite數據庫后,就需要建庫建表,由于把配置依賴準備好之后就會自動的建庫,因此我們這里主要關注的是建表,數據庫存儲的是交換機,隊列和綁定,因此應該針對三者建立不同的表。可以根據之前創建的核心類進行設計表。那么上述的建表操作什么時機來執行,可能程序需要反復部署多次,為了簡化部署的步驟,可以通過代碼,自動完成建表的操作。

? ? ? ? 為了自動完成建表操作,首先創建一個接口,內有需要建表的方法,然后實現對應的xml文件,通過xml實現接口中的抽象方法。對與建表操作我們使用undata標簽。最終,我們根據定義的類建立了三張表,但是對于其中的arguments,由于是Map屬性, 為了把arguments 存到數據庫中,需要把Map轉化為json格式的字符串。

import org.apache.ibatis.annotations.Mapper;@Mapper
public interface MetaMapper {// 三個核心建表方法void createExchangeTable();void createQueueTable();void createBindingTable();
}

????????當前,是把每個建表語句,都單獨的列為一個 update 標簽, 并且對應一個 java 方法,能否改成,一個 update 標簽中包含多個 建表語句,同時借助一個 java 方法,完成上述多個表的創建呢? MyBatis 支持,一個 標簽 中包含多個 sq| 語句的(前提是,搭配 MySQL 或者 Oracle).對于 SQLite,無法做到上述功能的,當你一個 update 標簽中,寫了多個 create table 語句的時候,只有第一個語句能執行.

? ? ? ? 如何實現把 arguments 這個鍵值對,和數據庫中的字符串類型相互轉換呢? 關鍵在于, MyBatis 在完成數據庫操作的時候,會自動的調用到對象的 getter 和 setter.

  • 比如 MyBatis 往數據庫中寫數據, 就會調用對象的 getter 方法,拿到屬性的值,再往數據庫中寫。如果這個過程中,讓 getArquments 得到的結果是 String 類型的,此時,就可以直接把這個數據寫到數據庫了
  • 比如 MyBatis 從數據庫讀數據的時候,就會調用對象的 setter 方法,把數據庫中讀到的結果設置到對象的屬性中.如果這個過程中,讓 setArguments,參數是一個 String,并且在 setArquments 內部針對字符串解析,解析成一個 Map 對象

因此我們需要自己寫Exchange類的getArguments和setArguments方法,其中getArguments用于MyBatis 往數據庫中寫數據,因此將Map轉為Json類型的字符串。從數據庫讀數據之后,構造Exchange對象,會自動調用到setArguments,是把arguments從json格式的字符串轉化為Map

????????第二個參數,用來描述當前 json 字符串, 要轉成的 java 對象是什么類型的.如果是個簡單類型,直接使用對應類型的類對象即可,如果是集合類這樣的復雜類型,可以使用 TypeReference 匿名內部類對象,來描述復雜類型的具體信息,(通過泛型參數來描述的)

????????對于 交換機 和 隊列 這兩個表,由于使用 name 作為主鍵,直接按照 name 進行刪除即可,對于綁定來說,此時沒有主鍵,刪除操作,其實是針對 exchangeName 和 queueName 兩個維度進行篩選.。之后需要在接口中聲明三個核心增刪方法,然后需要在xml文件中寫出insert和delete語句。如下:

?其中的#{}:MyBatis 看到這個, 就會通過 getArguments 方法, 來獲取到這個參數的內容,此處數據庫中期望的類型是 String, 此處也就需要讓 getArguments 能夠得到 String。

????????此時,我們把數據庫的基本操作已經借助MyBatis封裝完成。接下來寫一個類整合上面的操作。首先是數據庫的初始化,此處使用的是一個普通的方法。數據庫的初始化=建庫建表 +插入一些默認數據,我們期望, 在咱們的 broker server 啟動的時候, 做出下列邏輯判定:
1.如果數據庫已經存在了,(表啥的都有了),不做任何操作.
2.如果數據庫不存在, 則創建庫,創建表,構造默認數據

數據庫判斷是否存在就判定 meta.db 這個文件是否存在即可。根據以上邏輯編寫完成代碼之后,發現一些方法涉及到mapper的相關調用,那么此時mapper需要保證是被構造出來的,那么如何進行實例化?Mapper是通過Mybatis進行操作的,換句話說,Mapper已經被注冊到spring里面了,直接從spring里面拿到現成的對象。常用是@Autowired,但是前提是外面的類是一個注冊在spring中的對象,但是現在并不打算讓類是一個Bean對象,因為后面還需要手動進行管理,然后構造整體的結構,因此此時不可以用@Autowired,需要手動的構造。在啟動類添加一個靜態成員,在下面的main方法中,將run方法的返回結果賦值到靜態成員,此時借助這個靜態成員可以手動的獲取指定的bean對象了。接下來在類中完成接口的三個核心insert和delete方法,可以增加select操作。最后進行測試。

? ? ? ? 設計單元測試要求,單元測試用例和用例之間是需要相互獨立的,互不干擾的。因此可以這樣子:每個用例執行之前,先執行一段邏輯,搭建測試的環境,準備好測試用的東西;每個用例執行之后,再執行一段邏輯,把用例執行過程中產生的中間結果的影響給消除掉。即“準備工作”和“收尾工作”,加上注解。

? ? ? ? 準備工作:對數據庫進行初始化操作,由于init方法需要手動獲取metaMapper,依賴于context對象,因此在測試用例中也需要context對象.
? ? ? ? 收尾工作:前面是數據庫初始化,因此這里要清空數據庫,在清空時注意此處不能直接就刪除, 而需要先關閉上述 context 對象!! 此處的 context 對象, 持有了 MetaMapper 的實例, MetaMapper 實例又打開了 meta.db 數據庫文件。如果 meta.db 被別人打開了, 此時的刪除文件操作是不會成功的 (Windows 系統的限制, Linux 則沒這個問題),另一方面, 獲取 context 操作, 會占用 8080 端口. 此處的 close 也是釋放 8080

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895278.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895278.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895278.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Svelte前端框架

Svelte 簡介 Svelte 是一個現代的前端框架,用于構建高效、響應式的用戶界面。與 React、Vue 和 Angular 等傳統框架不同,Svelte 在構建時將組件編譯為高效的純 JavaScript 代碼,而不是在瀏覽器中運行一個龐大的運行時庫。這使得 Svelte 應用具…

【轉載】開源鴻蒙OpenHarmony社區運營報告(2025年1月)

●截至2025年1月31日,開放原子開源鴻蒙(OpenAtom OpenHarmony,簡稱“開源鴻蒙”或“OpenHarmony”)社區累計超過8200名貢獻者,共63家成員單位,產生51.2萬多個PR、2.9萬多個Star、10.5萬多個Fork、68個SIG。…

@SneakyThrows:是Java異常處理的“魔法外掛“,還是隱藏的“定時炸彈“?

引言:當Java的異常機制成為"甜蜜的負擔" Java的檢查型異常(Checked Exception)設計本意是提升代碼健壯性,但開發者常常陷入兩難: 要么用try-catch層層包裹代碼導致"金字塔噩夢",要么在…

雙周報Vol.65:新增is表達式、字符串構造和數組模式匹配增強、IDE模式匹配補全增強...多項技術更新!

MoonBit更新 新增 is 表達式 這個表達式的語法形式為 expr is pat,這個表達式為 Bool 類型,當 expr 符合 pat 這個模式的時候返回 true,比如: fn use_is_expr(x: Int?) -> Unit {if x is Some(i) && i > 10 { .…

Git 與持續集成 / 持續部署(CI/CD)的集成

一、引言 在當今快速發展的軟件開發領域,高效的代碼管理和持續的交付流程是項目成功的關鍵因素。Git 作為一款分布式版本控制系統,已經成為了開發者們管理代碼的標配工具;而持續集成 / 持續部署(CI/CD)則是一種能夠加…

百問網imx6ullpro調試記錄(linux+qt)

調試記錄 文章目錄 調試記錄進展1.開發板相關1.1百問網烏班圖密碼 1.2 換設備開發環境搭建串口調試網絡互通nfs文件系統掛載 1.3網絡問題1.4系統啟動1.5進程操作 2.QT2.1tslib1.獲取源碼2.安裝依賴文件3.編譯 2.2qt移植1.獲取qt源碼2.配置編譯器3.編譯 2.3拷貝到開發板1.拷貝2.…

開發中用到的設計模式

目錄 開發中用到的設計模式 工廠模式 設計理念 好處 體現的編程思想 適配器模式 概念 策略模式和適配器模式的區別 選擇策略模式而非適配器模式的原因 設計模式的開發原則 開發中用到的設計模式 在開發過程中,常見的設計模式會根據不同的業務場景和需求被…

1064 - You have an error in your SQL syntax;

在創建數據庫表建立外鍵是遇到了如下報錯 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near position(position_id) ) at line 8 數據庫表sql如下: --職位表 CR…

無人機 ,遙控器與接收機之前的通信

目錄 1、信號類型 2、工作頻率 3、通信協議 3.1、PPM 協議 3.2、SBUS 協議 3.3、CRSF 協議 無人機的遙控器和接收機之間常用的信號、頻率、協議等相關信息如下: 1、信號類型 模擬信號 特點:信號的幅度、頻率或相位等參數是連續變化的&#xff0c…

【c++】四種類型轉換形式

【c】四種類型轉換形式 編譯時: static_cast(靜態轉換) const_cast(去常性轉換) reinterpret_cast(重新解釋轉換,直接轉換地址) 運行時: dynamic_cast(動態轉換,運行時類…

Cisco ASR1002查看資源占用的幾條命令

查看平臺資源 show platform resource 該命令用于顯示整個平臺的資源使用情況,包括 CPU、內存等 example: ASR1002# show platform resources **State Acronym: H - Healthy, W - Warning, C - Critical Resource…

Day 1:認知革命與DeepSeek生態定位

目標:建立對大模型技術范式的系統性認知,掌握DeepSeek的核心技術特性與生態價值 一、大模型技術演進:從GPT到DeepSeek 1.1 技術發展里程碑 2017-Transformer突破:Self-Attention機制如何突破RNN的序列建模瓶頸 2018-GPT初代&…

Python自動化辦公之Excel拆分

在日常辦公中,我們經常需要將包含多個Sheet頁的Excel文件拆分成多個獨立的Excel文件。例如,在發送Excel表給各部門確認時,出于控制知悉范圍最小等保密性考慮,每個部門只需要查看和確認自己部門對應的Sheet頁。手動拆分Excel文件非…

【CXX-Qt】1.1 Rust中的QObjects

本文涉及到了使用CXX-Qt將Rust、C和QML集成到Qt應用程序中的各個方面。下面,我將提供一個簡單的示例,演示如何使用CXX-Qt來創建一個Rust結構體并將其作為QObject子類暴露給C和QML。 一、設置CXX-Qt環境 首先,確保您已經安裝了Rust、CXX和CX…

Conda命令整理

Conda 是一個功能強大的包和環境管理工具,廣泛用于 Python 開發中。除了基本的包和環境管理功能外,Conda 還提供了許多高級用法和技巧,幫助用戶更高效地管理和維護 Python 環境。 1. 管理 Conda 本身 命令描述示例conda --version查看 Cond…

C++模擬實現AVL樹

目錄 1.文章概括 2.AVL樹概念 3.AVL樹的性質 4.AVL樹的插入 5.旋轉控制 1.左單旋 2. 右單旋 3.左右雙旋 4.右左雙旋 6.全部代碼 1.文章概括 本文適合理解平衡二叉樹的讀者閱讀,因為AVL樹是平衡二叉樹的一種優化,其大部分實現邏輯與平衡二叉樹是…

opc da 服務器數據 轉 EtherCAT項目案例

目錄 1 案例說明 2 VFBOX網關工作原理 3 應用條件 4 查看OPC DA服務器的相關參數 5 配置網關采集opc da數據 6 啟動EtherCAT從站轉發采集的數據 7 在服務器上運行仰科OPC DA采集軟件 8 案例總結 1 案例說明 在OPC DA服務器上運行OPC DA client軟件查看OPC DA服務器的相…

實驗9 基于WebGoat平臺的SQL注入攻擊

實驗9 基于WebGoat平臺的SQL注入攻擊 1.實驗目的 熟悉WebGoat平臺,在該平臺上實現SQL注入攻擊。 2.實驗內容 (1)下載webgoat-server-8.2.2.jar。 (2)搭建java環境。 (3)運行webgoat。 &#xf…

StochSync:可在任意空間中生成360°全景圖和3D網格紋理

StochSync方法可以用于在任意空間中生成圖像,尤其是360全景圖和3D網格紋理。該方法利用了預訓練的圖像擴散模型,以實現零-shot生成,消除了對新數據收集和單獨訓練生成模型的需求。StochSync 結合了 Diffusion Synchronization(DS&…

研發管理知識

定義 研發管理是對研發活動進行有效的計劃、組織、領導和控制的過程,旨在通過合理配置資源、協調團隊工作、監控項目進度和質量等,確保研發項目能夠按時、按質、按量完成,實現企業的技術創新和產品升級目標,增強企業的核心競爭力。…