集群環(huán)境下,定時任務(wù)的簡單實現(xiàn)

最近項目中新增的一個功能是定時解綁未登錄超過30天的用戶。
由于生產(chǎn)環(huán)境下是4臺服務(wù)器,為防止集群服務(wù)器定時任務(wù)多次執(zhí)行和提高執(zhí)行成功率,設(shè)計如下功能的實現(xiàn)。

一、設(shè)計思路和實現(xiàn)方案:

??思路:數(shù)據(jù)庫新建一張表,以當(dāng)天日期(yyyyMMdd)作為主鍵。定時任務(wù)入口會新增到此表一條數(shù)據(jù),新增成功,則執(zhí)行接下來的定時任務(wù);若新增失敗被catch到異常,則return,不執(zhí)行接下來的定時任務(wù)。
定時任務(wù)主表:
??主鍵:id
??解綁數(shù)量:unbind_num
??執(zhí)行服務(wù)器ip:execute_ip
??創(chuàng)建時間:create_time
定時任務(wù)詳情記錄表:
??主鍵:id
??解綁數(shù)據(jù)的主要信息字段(此處不再記錄詳細字段,根據(jù)自己的需求記錄即可)
??解綁方式:unbind_type(可區(qū)分是定時任務(wù)解綁還是用戶主動解綁)
??執(zhí)行服務(wù)器ip:execute_ip
??創(chuàng)建時間:create_time

說明:主表的解綁數(shù)量和執(zhí)行ip都是在定時任務(wù)執(zhí)行完成后,根據(jù)主鍵進行的更新。(定時任務(wù)一開始就insert到主表一個主鍵 ,主要是獲取執(zhí)行權(quán),防止有多個服務(wù)器同時獲取執(zhí)行權(quán),最后解綁卻出現(xiàn)問題)

定時任務(wù)程序入口:
MesQuartzJob mesQuartzJob = new MesQuartzJob();
        mesQuartzJob.setQuId(timeYMD);
        mesQuartzJob.setCreateTime(date);
        String serIp ="";
        try {
            int insertSelective = mesQuartzJobMapper.insertSelective(mesQuartzJob);
             serIp = GetIpUtils.getSerIp();
        } catch (Exception e) {
            log.error(
                    "method:RemoveBindQuartzJob:removeBindOutTime|mesQuartzJobMapper.insertSelective;inParam:執(zhí)行服務(wù)器={};mesQuartzJob={};執(zhí)行定時任務(wù);異常:",
                    serIp,mesQuartzJob.toString(), e);
            return;
        }
##在之后的代碼為解綁的執(zhí)行邏輯,省略
##解綁完成后統(tǒng)計解綁數(shù)量并更新到主表
定時任務(wù)我們使用的quartz:

以下配置我們放在了spring的配置文件中,需保證RemoveBindQuartzJob實體被掃描到:

<!-- 全部定義到內(nèi)部bean中,可以添加多個任務(wù) -->
    <bean id="scheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <!-- 解除綁定超過30天的操作員,注意:admin需特殊處理 -->
                <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
                    <property name="jobDetail">
                        <bean
                            class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
                            <!-- 執(zhí)行類 -->
                            <property name="targetObject">
                                <ref bean="removeBindQuartzJob" />
                            </property>
                            <!-- 類中要定時執(zhí)行的方法 -->
                            <property name="targetMethod">
                                <value>removeBindOutTime</value>
                            </property>
                        </bean>
                    </property>
                    <property name="cronExpression" value=" 0 0 2 * * ? *" />
                </bean>
                
            </list>
        </property>
    </bean>

    <!-- 配置任務(wù)所在的類 -->
    <bean id="removeBindQuartzJob" class="com.xxx.xxx.quartz.RemoveBindQuartzJob" />
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容