基于模板設計模式開發優惠券推送功能以及對過期優惠卷進行定時清理

1.模板設計模式:

模板設計模式是一種常見的設計模式,主要作用是對 具體操作的 共有代碼塊進行提取,提升代碼復用性。

那么說道代碼復用性,首先想到的是抽象類而不是接口。

因為抽象類的本質就是為了代碼復用,抽象類既可以包含抽象方法也可以包含具體方法。

在模板設計模式中,我們將 需要將原本共有的具體操作抽離并封裝在抽象類的具體方法中。讓抽象類的具體操作來實現需要被復用的邏輯。而其余的抽象方法是不同業務的 個性,各個業務可以按照自己的方式進行重寫。這部分特性在模板設計模式中是為具體方法服務的。

2.開發優惠券推送功能

優惠券推送功能是根據excel導出方式來進行的。目前我們有一張優惠券,畫像平臺根據用戶特性選取出符合這張優惠券的用戶,從而導出一個excel表格,表格中裝入的是符合發券特征的用戶。我們的優惠券推送功能就是根據讀取excel表格中的用戶信息,將這張優惠券統一推送給目標用戶。

對于優惠券發放,我們考慮到了定時發放和立即發放兩種情況。由于定時發放使用傳統的定時任務需要建立線程定時去掃描全表,造成數據庫的較大開銷,所以考慮使用RocketMQ來進行定時任務。

RocketMQ的延時消息任務,需要發送地址、消息以及發送時間三個參數。

public SendResult syncSendDelayTimeMills(String destination, Message<?> message, long delayTime) {return this.syncSend(destination, message, (long)this.producer.getSendMsgTimeout(), delayTime, DelayMode.DELAY_MILLISECONDS);
}

這是對應的rocketMQ的定時消息發送接口,需要destination,message,delayTime

2.1發送地址

對于不同的業務,建立不同的group,消費者會根據group從消息隊列中接收自己想要的信息。

2.2消息

需要注意的是Message<?>是指上是Spring中的包import org.springframework.messaging.Message;

Message通過MessageBuilder進行構建,這部分內容就是消息實體。

2.3發送時間

delayTime就是指延遲發送的時間。

3.如何抽離出模板設計模式

由于我們的業務不僅有延時發送任務,還有立即發送任務,所以會為這兩種任務設計消息發送類AbstractCommonSendProduceTemplate,很顯然,這是共有的抽象類。

然后為不同的業務創建不同的實現類,繼承AbstractCommonSendProduceTemplate。

3.1如何判斷是立即發送還是延時發送?

我們只需要設計一個屬性,根據屬性的值來判斷即可。這可以解決立即發送和延時發送的矛盾。在業務層無需再進行判斷。

3.2具體如何完整實現模板設計模式?

在上面我們講解了類的抽離,我們現在需要找立即發送與延時發送的區別,抽離出共性與特性。

共性很顯然就是都需要使用rocketMQ進行消息發送。

1.特性:對于立即發送而言,需要的api不是syncSendDelayTimeMills而是syncSend,

public SendResult syncSend(String destination, Message<?> message, long timeout) {return this.syncSend(destination, message, timeout, 0);
}

timeout是超時時間。這是第一個特性。

2.處理的業務模塊不同,在項目中,推送優惠券模塊的推送功能可以是定時推送也可以是立即推送,包含這兩種方式。

而對于優惠券創建模塊的定時銷毀過期優惠券功能目前只需要定時任務方式。

所以對于不同的業務,我們需要抽離出不同的事件,因為不同的業務需要的參數不同,這里我們的項目定義了兩個事件類:CouponTaskExecuteEvent、CouponTemplateDelayEvent

基于上述的共性與特性,具體如何實現?

從頂層考慮,我們的目的是實現發送消息代碼的復用,所以我們抽離代碼的時候一般而言是先抽取主要邏輯,對應抽象類中的具體方法。

當具體方法因不同業務模塊需要不同參數的時候我們再使用抽象方法對”個性“進行實現即可。也就是上述內容所說的抽象方法為具體方法服務的思想。

因為定時和立即發送api不同,所以我們需要一個dto類來傳遞一個屬性來驗證是定時發送還是立即發送。

所以現在我們需要創建一個共有的DTO類來輔助具體任務的開發。DTO應該包含多個業務的主要內容,所以對于這種模板設計模式而言,盡量使業務功能相近,不然在DTO設計時不好設計。

public class BaseSendExtendDTO {/*** 事件名稱*/private String eventName;/*** 主題*/private String topic;/*** 標簽*/private String tag;/*** 業務標識*/private String keys;/*** 發送消息超時時間*/private Long sentTimeout;/*** 具體延遲時間*/private Long delayTime;
}

事件名稱用于分辨不同功能,主題用于不同消息類型的監聽,如果是立即發送,則delayTime為null,用于判斷信息類型。

需要注意的是,該DTO類只是用于輔助消息發送,和真正的業務無關。比如說用于判別目前的任務是那個業務模塊,執行業務模塊中的哪個任務,任務的信息發送是什么模式等等。

比如在:

public SendResult syncSendDelayTimeMills(String destination, Message<?> message, long delayTime) {

return this.syncSend(

destination, message,

(long)this.producer.getSendMsgTimeout(),

delayTime, DelayMode.DELAY_MILLISECONDS);

}

這個 發送api中,DTO類只控制destination與delayTime,而message是由事件決定的。

4.總結

通過上述DTO可以使得不同功能模塊找到自己的實現方式(比如立即發送和延時發送就是通過判別DTO中delayTime是否為null,再比如通過Topic使得不同消費者只監聽自己的內容)。

通過兩個事件類對兩個功能模塊所需屬性做了區分,實質上最終傳遞的內容就是對應的事件。

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

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

相關文章

對象的finalization機制Test1

Java語言提供了對象終止(finalization)機制來允許開發人員自定義對象被銷毀之前的處理邏輯。當垃圾回收器發現沒有引用指向一個對象時&#xff0c;通常接下來要做的就是垃圾回收&#xff0c;即清除該對象&#xff0c;而finalization機制使得在清除此對象之前&#xff0c;總會先…

RJ45 連接器(水晶頭)的引腳定義

RJ45連接器核心定義 【】物理結構 8個金屬觸點&#xff08;Pin 1至Pin 8&#xff09;的透明塑料插頭&#xff0c;帶塑料卡榫。 引腳編號規則 卡榫朝下&#xff0c;金屬觸點面向自己時&#xff1a; 最左側為 Pin 1 最右側為 Pin 8 順序&#xff1a;Pin 1 → Pin 2 → Pin 3 → P…

小架構step系列08:logback.xml的配置

1 概述 logback.xml配置文件的詳細配置&#xff0c;很多地方都說得比較細&#xff0c;本文主要從幾個重點來看一下原理&#xff0c;了解原理能夠幫助確定哪些應該配置&#xff0c;以及如何配置。 logback.xml是為打印日志服務的&#xff0c;打印的內容一般打印到控制臺(Conso…

STM32中SPI協議詳解

前言 在嵌入式系統中&#xff0c;設備間的數據傳輸協議多種多樣&#xff0c;SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外設接口&#xff09;憑借其高速、全雙工、易用性等特點&#xff0c;成為連接STM32與高速外設&#xff08;如OLED屏、Flash芯片、AD轉換器…

TypeScript 接口全解析:從基礎到高級應用

TypeScript 接口全解析&#xff1a;從基礎到高級應用在 TypeScript 中&#xff0c;接口是定義數據結構和行為規范的強大工具&#xff0c;它能夠顯著提升代碼的可讀性、可維護性和類型安全性。本文將全面講解 TypeScript 接口的相關知識點&#xff0c;從基礎語法到高級特性&…

主存(DRAM)是什么?

主存&#xff08;DRAM&#xff09;是什么&#xff1f; 主存&#xff08;DRAM&#xff09;詳解 主存&#xff08;Main Memory&#xff09; 通常由 DRAM&#xff08;Dynamic Random Access Memory&#xff0c;動態隨機存取存儲器&#xff09; 構成&#xff0c;是計算機系統中用于…

Python 機器學習核心入門與實戰進階 Day 6 - 模型保存與加載(joblib / pickle)

? 今日目標 掌握如何將訓練好的模型持久化保存到文件熟悉兩種主流保存方式&#xff1a;joblib 和 pickle加載模型并應用于新數據預測實現完整的“訓練 → 保存 → 加載 → 預測”流程為后續部署做準備&#xff08;如 Flask、FastAPI&#xff09;&#x1f9f0; 一、模型保存工具…

【SigNoz部署安裝】Ubuntu環境部署SigNoz:Docker容器化監控的全流程指南

文章目錄前言1.關于SigNoz2.本地部署SigNoz3.SigNoz簡單使用4. 安裝內網穿透5.配置SigNoz公網地址6. 配置固定公網地址前言 在分布式架構主導的現代運維體系中&#xff0c;系統性能監控正面臨范式變革的關鍵轉折。當微服務架構遭遇服務雪崩、無服務器架構出現冷啟動延遲等復雜…

NV298NV312美光固態閃存NW639NW640

美光固態閃存技術全景解析&#xff1a;從NV298到NW640的深度探索近年來&#xff0c;美光科技憑借其在3D NAND閃存技術上的持續突破&#xff0c;推出了多款備受市場關注的固態硬盤產品。本文將從技術評測、產品對比、市場趨勢、用戶反饋及應用場景等多個維度&#xff0c;深入剖析…

2025.07.04【服務器】|使用萬兆網卡提升服務器間互聯速度,實現快速數據傳輸

文章目錄1. **萬兆網卡概述**2. **為什么選擇萬兆網卡**3. **萬兆網卡配置與安裝**3.1 **安裝網卡**3.2 **安裝驅動程序**3.3 **檢查網卡狀態**4. **配置網絡接口**4.1 **Linux 系統配置**4.2 **Windows 系統配置**5. **優化性能**5.1 **使用多線程傳輸**5.2 **開啟 TCP/UDP 窗…

光伏發電量精準估算,提升投資效益

在光伏產業規模化發展進程中&#xff0c;準確估算光伏發電量是提升項目投資效益的關鍵環節。科學的發電量預測不僅能為項目可行性研究提供依據&#xff0c;更能在電站全生命周期內優化運營策略&#xff0c;實現投資回報最大化。基于多維度數據整合與智能算法構建的精準預測體系…

Linux的互斥鎖、Linux的POSIX信號量(二值、計數)、RTOS的二值信號量

鎖和信號量最大的區別就是:鎖嚴格要求 “誰占用誰釋放”,而信號量允許 “一個任務 / 線程釋放,另一個任務 / 線程獲取”。 特性互斥鎖(Mutex)POSIX 信號量(Semaphore)初始狀態初始為 “鎖定”(PTHREAD_MUTEX_INITIALIZER),需顯式獲取(pthread_mutex_lock)。初始值可…

基于Java+SpringBoot 協同過濾算法私人診所管理系統

源碼編號&#xff1a;S607源碼名稱&#xff1a;基于SpringBoot5的協同過濾算法的私人診所管理系統用戶類型&#xff1a;雙角色&#xff0c;患者、醫生、管理員數據庫表數量&#xff1a;15 張表主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven運行環境&#xff1…

什么是DINO?

DINO 是一個由 Meta AI (當時的 Facebook AI) 在 2021 年提出的自監督學習框架&#xff0c;其全稱是 “self-DIstillation with NO labels”&#xff0c;直譯為“無標簽的自我蒸餾”。這個名字精準地概括了它的核心思想。 DINO 的出現是一個里程碑&#xff0c;因為它首次有力地…

如何在 Android Framework層面控制高通(Qualcomm)芯片的 CPU 和 GPU。

如何在 Android Framework層面控制高通&#xff08;Qualcomm&#xff09;芯片的 CPU 和 GPU。 參考&#xff1a;https://blog.csdn.net/YoungHong1992/article/details/117047839?utm_source%20%20uc_fansmsg 作為一名 Framework 開發者&#xff0c;您擁有系統級的權限&#…

程序員在線接單

十年Java全棧工程師在線接單Java程序代做&#xff0c;兼職接單&#xff0c;系統代做&#xff0c;二次開發&#xff0c;網站開發部署&#xff0c;項目合作&#xff0c;商業項目承包 全棧開發&#xff0c;支持定制各種管理系統、小程序 商用或個人使用等項目都接 服務二: Java調試…

Python 異步爬蟲(aiohttp)高效抓取新聞數據

一、異步爬蟲的優勢 在傳統的同步爬蟲中&#xff0c;爬蟲在發送請求后會阻塞等待服務器響應&#xff0c;直到收到響應后才會繼續執行后續操作。這種模式在面對大量請求時&#xff0c;會導致大量的時間浪費在等待響應上&#xff0c;爬取效率較低。而異步爬蟲則等待可以在服務器…

Jenkins Pipeline(二)

1.Pipeline 變量 在 Jenkins 管道&#xff08;Pipeline&#xff09;中&#xff0c;變量是一種非常有用的功能&#xff0c;它們可以幫助你在構建過程中存儲和傳遞數據。Jenkins 管道支持多種方式來定義和使用變量&#xff0c;包括環境變量、腳本變量以及全局變量。 1.2 腳本變…

springsecurity02

提前打開Redis1&#xff09;通過內置的用戶名和密碼登錄spring-boot-starter-security.jar2&#xff09;使用自定義用戶名和密碼登錄UserDetailService自定義類實現UserDetailService接口&#xff0c;重寫loadUserByUsername方法class UserDetailServiceImpl implements UserDe…

Apache組件遭大規模攻擊:Tomcat與Camel高危RCE漏洞引發數千次利用嘗試

漏洞態勢分析帕洛阿爾托網絡公司Unit 42團隊最新研究報告顯示&#xff0c;針對Apache Tomcat和Apache Camel關鍵漏洞的網絡攻擊正在全球激增。2025年3月披露的這三個遠程代碼執行&#xff08;RCE, Remote Code Execution&#xff09;漏洞——CVE-2025-24813&#xff08;Tomcat&…