本發(fā)明涉及計算機(jī)軟件
技術(shù)領(lǐng)域:
:,特別涉及一種基于quartz的可定制消息發(fā)送方法。
背景技術(shù):
::伴隨著互聯(lián)網(wǎng)時代的到來,網(wǎng)絡(luò)技術(shù)的應(yīng)用也是空前廣泛。利用網(wǎng)絡(luò)推送消息,發(fā)送通知公告或者提醒消息也越來越廣泛。目前較為常見的消息推送機(jī)制有:固定消息單次發(fā)送、固定消息定時發(fā)送、消息被觸發(fā)發(fā)送(驗證碼等)。quartz是一個完全由java編寫的開源作業(yè)調(diào)度框架,是opensymphony開源組織在jobscheduling領(lǐng)域又一個開源項目,它可以與j2ee與j2se應(yīng)用程序相結(jié)合也可以單獨使用。quartz可以用來創(chuàng)建簡單或為運行十個,百個,甚至是好幾萬個jobs這樣復(fù)雜的程序。jobs可以做成標(biāo)準(zhǔn)的java組件或ejbs。基于此,本發(fā)明提出了一種基于quartz的可定制消息發(fā)送方法,實現(xiàn)了消息模板可定制,消息發(fā)送時間可設(shè)定修改的功能。quartz框架的核心是調(diào)度器。調(diào)度器負(fù)責(zé)管理quartz應(yīng)用運行時環(huán)境。調(diào)度器不是靠自己做所有的工作,而是依賴框架內(nèi)一些非常重要的部件。quartz不僅僅是線程和線程管理。為確保可伸縮性,quartz采用了基于多線程的架構(gòu)。啟動時,框架初始化一套worker線程,這套線程被調(diào)度器用來執(zhí)行預(yù)定的作業(yè),這就是quartz能并發(fā)運行多個作業(yè)的原理。quartz依賴一套松耦合的線程池管理部件來管理線程環(huán)境。技術(shù)實現(xiàn)要素:本發(fā)明為了彌補(bǔ)現(xiàn)有技術(shù)的缺陷,提供了一種簡單高效的基于quartz的可定制消息發(fā)送方法。本發(fā)明是通過如下技術(shù)方案實現(xiàn)的:一種基于quartz的可定制消息發(fā)送方法,其特征在于,包括以下步驟:(1)設(shè)定消息模板,輸入消息模板名稱,設(shè)置消息生成時間,發(fā)送頻率和發(fā)送時間,(2)設(shè)置消息接收人,一條消息模板可以被多人定制,同時一個人可以定制多條消息模板;(3)quartz執(zhí)行調(diào)度,創(chuàng)建一個實現(xiàn)org.quartz.job接口的java類;(4)quartz支持集群部署,創(chuàng)建并設(shè)定配置quartz.propeties文件;(5)調(diào)度器調(diào)度消息生成的模塊,根據(jù)消息模板和消息訂閱情況自動批量生成消息;(6)將生成的消息存放到待發(fā)區(qū);(7)調(diào)度器調(diào)度消息發(fā)送的模塊,即調(diào)度消息發(fā)送定時器,將消息發(fā)送至各個渠道。所述步驟(1)中,消息模板名稱可以作為消息標(biāo)題顯示;消息模板可以為純文字,也可以在消息生成過程中根據(jù)規(guī)則動態(tài)添加相應(yīng)的指標(biāo)參數(shù);消息模板的有效期表示根據(jù)消息模板生成消息的有效起止時間,超過或者早于當(dāng)前時間,消息將不生成;消息的發(fā)送頻率可以設(shè)置日度、月度或年度,即每日發(fā)送、每月發(fā)送、每年發(fā)送;消息的發(fā)送時間即每天發(fā)送消息的時刻。所述步驟(2)中,根據(jù)不同的模板生成不同的消息,根據(jù)消息接收人的權(quán)限范圍,依據(jù)消息模板生成的消息中的數(shù)據(jù)會略有不同。所述步驟(4)中,quartz.propeties文件中配置集群中各服務(wù)器的id和quartz調(diào)度器id,quartz線程池的實現(xiàn)類,quartz線程池中線程數(shù),quartz線程優(yōu)先級,實現(xiàn)集群時任務(wù)的存儲實現(xiàn)方式,quartz存儲任務(wù)相關(guān)數(shù)據(jù)的表的前綴,連接數(shù)據(jù)庫數(shù)據(jù)源名稱,是否啟用集群,連接數(shù)據(jù)庫的實現(xiàn)類,連接數(shù)據(jù)庫鏈接,連接數(shù)據(jù)庫用戶名,連接數(shù)據(jù)庫密碼和最大數(shù)據(jù)庫連接數(shù)。所述各服務(wù)器的id自動生成,無需修改;由于配置集群時,只有一個quartz調(diào)度器,集群中每個服務(wù)器的quartz調(diào)度器id值都相同;所述quartz線程池中線程數(shù)根據(jù)任務(wù)量和負(fù)責(zé)程度來調(diào)整;所述quartz線程優(yōu)先級為:當(dāng)任務(wù)到達(dá)執(zhí)行時間,且線程池中沒有可用線程時,若任務(wù)等待的時間超過配置的最大值,則本次任務(wù)不執(zhí)行,等待下一次執(zhí)行時間的到來;啟用集群后,集群中的服務(wù)器相互檢測間隔,各服務(wù)器按照配置的時間間隔往服務(wù)器中更新狀態(tài);當(dāng)服務(wù)器超過配置時間沒有更新狀態(tài)時,調(diào)度器認(rèn)為該服務(wù)器已經(jīng)down掉,不再分配任務(wù)給該服務(wù)器;所述連接數(shù)據(jù)庫的實現(xiàn)類與連接數(shù)據(jù)庫鏈接的配置參照iam數(shù)據(jù)庫配置文件中的配置。本發(fā)明的有益效果是:該基于quartz的可定制消息發(fā)送方法,能夠靈活定制消息模板、自主設(shè)定發(fā)送時間,實現(xiàn)了消息的自動批量生成和定時準(zhǔn)點發(fā)送,解決了消息內(nèi)容局限、消息業(yè)務(wù)覆蓋面較狹窄、消息發(fā)送的頻率單一以及消息定點推送、個性定制困難的難題,增強(qiáng)了消息發(fā)送的靈活性。附圖說明附圖1為本發(fā)明基于quartz的可定制消息發(fā)送方法流程示意圖。具體實施方式為了使本發(fā)明所要解決的技術(shù)問題、技術(shù)方案及有益效果更加清楚明白,以下結(jié)合附圖和實施例,對本發(fā)明進(jìn)行詳細(xì)的說明。應(yīng)當(dāng)說明的是,此處所描述的具體實施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。該基于quartz的可定制消息發(fā)送方法,包括以下步驟:(1)設(shè)定消息模板,輸入消息模板名稱,設(shè)置消息生成時間,發(fā)送頻率和發(fā)送時間,(2)設(shè)置消息接收人,一條消息模板可以被多人定制,同時一個人可以定制多條消息模板;(3)quartz執(zhí)行調(diào)度,創(chuàng)建一個實現(xiàn)org.quartz.job接口的java類;(4)quartz支持集群部署,創(chuàng)建并設(shè)定配置quartz.propeties文件;(5)調(diào)度器調(diào)度消息生成的模塊,根據(jù)消息模板和消息訂閱情況自動批量生成消息;(6)將生成的消息存放到待發(fā)區(qū);(7)調(diào)度器調(diào)度消息發(fā)送的模塊,即調(diào)度消息發(fā)送定時器,將消息發(fā)送至各個渠道。所述步驟(1)中,消息模板名稱可以作為消息標(biāo)題顯示;消息模板可以為純文字,也可以在消息生成過程中根據(jù)規(guī)則動態(tài)添加相應(yīng)的指標(biāo)參數(shù);消息模板的有效期表示根據(jù)消息模板生成消息的有效起止時間,超過或者早于當(dāng)前時間,消息將不生成;消息的發(fā)送頻率可以設(shè)置日度、月度或年度,即每日發(fā)送、每月發(fā)送、每年發(fā)送;消息的發(fā)送時間即每天發(fā)送消息的時刻。所述步驟(2)中,根據(jù)不同的模板生成不同的消息,根據(jù)消息接收人的權(quán)限范圍,依據(jù)消息模板生成的消息中的數(shù)據(jù)會略有不同。所述步驟(3)中,quartz執(zhí)行調(diào)度,啟動定時器。創(chuàng)建一個實現(xiàn)org.quartz.job接口的java類:/***@description:任務(wù)執(zhí)行類**@classname:quartzjob*/publicclassquartzjobimplementsjob{@overridepublicvoidexecute(jobexecutioncontextcontext)throwsjobexecutionexception{map<string,string>paramap=newhashmap<string,string>();datecurdate=newdate(system.currenttimemillis());stringtaskname=(string)context.getmergedjobdatamap().get("taskname");map<string,string>operation=(map<string,string>)context.getmergedjobdatamap().get("operation");stringclassname="";stringmethodname="";stringxxmbid="";if(!commonutility.isempty(operation)){classname=operation.get("classname");methodname=operation.get("methodname");xxmbid=operation.get("xxmbid");}paramap.put("taskname",taskname);try{classcls=class.forname(classname);methodmethod=cls.getdeclaredmethod(methodname,newclass[]{string.class,string.class});stringresult=(string)method.invoke(cls.newinstance(),xxmbid,null);}catch(exceptione){e.printstacktrace();quartzmanager.removejob(taskname);}}所述步驟(4)中,quartz.propeties文件中配置集群中各服務(wù)器的id和quartz調(diào)度器id,quartz線程池的實現(xiàn)類,quartz線程池中線程數(shù),quartz線程優(yōu)先級,實現(xiàn)集群時任務(wù)的存儲實現(xiàn)方式,quartz存儲任務(wù)相關(guān)數(shù)據(jù)的表的前綴,連接數(shù)據(jù)庫數(shù)據(jù)源名稱,是否啟用集群,連接數(shù)據(jù)庫的實現(xiàn)類,連接數(shù)據(jù)庫鏈接,連接數(shù)據(jù)庫用戶名,連接數(shù)據(jù)庫密碼和最大數(shù)據(jù)庫連接數(shù)。quartz.propeties文件配置樣例如下:#由于配置集群時,只有一個quartz調(diào)度器,集群中每個服務(wù)器的quartz調(diào)度器id值都相同org.quartz.scheduler.instancename=scheduler1#集群中每臺服務(wù)器自己的id自動生成,無需修改org.quartz.scheduler.instanceid=auto#configurethreadpool#quartz線程池的實現(xiàn)類,無需修改org.quartz.threadpool.class=org.quartz.simpl.simplethreadpool#simplethreadpool#quartz線程池中線程數(shù),可以根據(jù)任務(wù)數(shù)量和負(fù)責(zé)度來調(diào)整org.quartz.threadpool.threadcount=5#quartz線程優(yōu)先級org.quartz.threadpool.threadpriority=5#configurejobstore#表示如果某個任務(wù)到達(dá)執(zhí)行時間,而此時線程池中沒有可用線程時,任務(wù)等待的最大時間,如果等待時間超過下面配置的值(毫秒),#本次就不在執(zhí)行,而等待下一次執(zhí)行時間的到來,可以根據(jù)任務(wù)量和負(fù)責(zé)程度來調(diào)整org.quartz.jobstore.misfirethreshold=600000#實現(xiàn)集群時,任務(wù)的存儲實現(xiàn)方式,org.quartz.impl.jdbcjobstore.jobstoretx表示數(shù)據(jù)庫存儲,無需修改org.quartz.jobstore.class=org.quartz.impl.jdbcjobstore.jobstoretx#quartz存儲任務(wù)相關(guān)數(shù)據(jù)的表的前綴,無需修改org.quartz.jobstore.tableprefix=qrtz_#連接數(shù)據(jù)庫數(shù)據(jù)源名稱,與下面配置中org.quartz.datasource.myds的myds一致即可,可以無需修改org.quartz.jobstore.datasource=myds#是否啟用集群,啟用,改為true,注意:啟用集群后,必須配置下面的數(shù)據(jù)源,否則quartz調(diào)度器會初始化失敗org.quartz.jobstore.isclustered=false#集群中服務(wù)器相互檢測間隔,每臺服務(wù)器都會按照下面配置的時間間隔往服務(wù)器中更新自己的狀態(tài),#如果某臺服務(wù)器超過以下時間沒有checkin,調(diào)度器就會認(rèn)為該臺服務(wù)器已經(jīng)down掉,不會再分配任務(wù)給該臺服務(wù)器org.quartz.jobstore.clustercheckininterval=20000#non-managedconfiguredatasource#配置連接數(shù)據(jù)庫的實現(xiàn)類,可以參照iam數(shù)據(jù)庫配置文件中的配置org.quartz.datasource.myds.driver=oracle.jdbc.driver.oracledriver#配置連接數(shù)據(jù)庫連接,可以參照iam數(shù)據(jù)庫配置文件中的配置org.quartz.datasource.myds.url=jdbc:oracle:thin:@ip:port:ora#配置連接數(shù)據(jù)庫用戶名org.quartz.datasource.myds.user=****#配置連接數(shù)據(jù)庫密碼org.quartz.datasource.myds.password=*****#最大數(shù)據(jù)庫連接數(shù)org.quartz.datasource.myds.maxconnections=10當(dāng)前第1頁12當(dāng)前第1頁12