最近項目中新增的一個功能是定時解綁未登錄超過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" />