add clean job

This commit is contained in:
fanqq 2015-10-21 15:49:20 +08:00
parent 3940731d61
commit f2a46f4649
8 changed files with 309 additions and 0 deletions

View file

@ -0,0 +1,29 @@
package com.ctrip.zeus.clean;
import com.ctrip.zeus.executor.TaskWorker;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* Created by fanqq on 2015/10/16.
*/
@DisallowConcurrentExecution
public class CleanDbJob extends QuartzJobBean {
CleanDbManager cleanDbManager;
Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
try{
cleanDbManager.run();
}catch (Exception e){
logger.warn("[clean db job] clean db exception."+e.getMessage(),e);
}
}
public void setCleanDbManager(CleanDbManager cleanDbManager) {
this.cleanDbManager = cleanDbManager;
}
}

View file

@ -0,0 +1,54 @@
package com.ctrip.zeus.clean;
import com.ctrip.zeus.service.clean.CleanFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* Created by fanqq on 2015/10/16.
*/
@Component("cleanDbManager")
public class CleanDbManager {
private static Long ticks = 0L;
@Resource
private CleanFilter oprationLogCleanFilter;
@Resource
private CleanFilter taskCleanFilter;
private List<CleanFilter> filters = new ArrayList<>();
private boolean inited = false;
Logger logger = LoggerFactory.getLogger(this.getClass());
public void run() throws Exception{
init();
for (CleanFilter filter : filters){
if (filter.interval() == 0){
continue;
}
if (ticks % filter.interval() == 0){
try {
filter.runFilter();
}catch (Exception e){
logger.warn("[Clean Manager]Execute Clean Filter Failed.Filter:"+filter.getClass().getSimpleName(),e);
}
}
}
ticks++;
}
private void init() {
if (inited){
return;
}
filters.add(oprationLogCleanFilter);
filters.add(taskCleanFilter);
inited = true;
}
}

View file

@ -0,0 +1,16 @@
package com.ctrip.zeus.service.clean;
/**
* Created by fanqq on 2015/10/20.
*/
public interface CleanFilter {
/**
* Filter runner.
*/
public void runFilter()throws Exception;
/**
* return interval . Unit for hours. never run if return 0 .
*/
public int interval();
}

View file

@ -0,0 +1,48 @@
package com.ctrip.zeus.service.clean.impl;
import com.ctrip.zeus.dal.core.*;
import com.ctrip.zeus.service.clean.CleanFilter;
import com.ctrip.zeus.service.query.SlbCriteriaQuery;
import com.netflix.config.DynamicIntProperty;
import com.netflix.config.DynamicPropertyFactory;
import javax.annotation.Resource;
import java.util.Set;
/**
* Created by fanqq on 2015/10/20.
*/
public class ConfCleanFilter implements CleanFilter {
@Resource
private NginxConfDao nginxConfDao;
@Resource
private NginxConfServerDao nginxConfServerDao;
@Resource
private NginxConfUpstreamDao nginxConfUpstreamDao;
@Resource
private SlbCriteriaQuery slbCriteriaQuery;
private static DynamicIntProperty confSaveCounts = DynamicPropertyFactory.getInstance().getIntProperty("config.save.count", 100000);
@Override
public void runFilter() throws Exception {
Set<Long> slbIds = slbCriteriaQuery.queryAll();
for (Long slbId : slbIds){
//remove nginx_conf
NginxConfDo nginxConfDo = nginxConfDao.findBySlbIdAndMaxVersion(slbId, NginxConfEntity.READSET_FULL);
nginxConfDao.deleteBySlbIdLessThanVersion(new NginxConfDo().setVersion(nginxConfDo.getVersion()-confSaveCounts.get()).setSlbId(slbId));
//remove nginx_conf_server
NginxConfServerDo nginxConfServerDo = nginxConfServerDao.findBySlbIdAndMaxVersion(slbId,NginxConfServerEntity.READSET_FULL);
nginxConfServerDao.deleteBySlbIdLessThanVersion(new NginxConfServerDo().setSlbId(slbId).setVersion(nginxConfServerDo.getVersion()-confSaveCounts.get()));
//remove nginx_conf_upstreams
NginxConfUpstreamDo nginxConfUpstreamDo = nginxConfUpstreamDao.findBySlbIdAndMaxVersion(slbId,NginxConfUpstreamEntity.READSET_FULL);
nginxConfUpstreamDao.deleteBySlbIdLessThanVersion(new NginxConfUpstreamDo().setSlbId(slbId).setVersion(nginxConfUpstreamDo.getVersion()-confSaveCounts.get()));
}
}
@Override
public int interval() {
return 12;
}
}

View file

@ -0,0 +1,37 @@
package com.ctrip.zeus.service.clean.impl;
import com.ctrip.zeus.dal.core.OperationLogDao;
import com.ctrip.zeus.dal.core.OperationLogDo;
import com.ctrip.zeus.service.clean.CleanFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.unidal.dal.jdbc.DalException;
import javax.annotation.Resource;
import java.util.Calendar;
import java.util.Date;
/**
* Created by fanqq on 2015/10/20.
*/
@Service("oprationLogCleanFilter")
public class OprationLogCleanFilter implements CleanFilter {
@Resource
private OperationLogDao operationLogDao;
Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void runFilter() throws Exception {
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(new Date());
rightNow.add(Calendar.DAY_OF_YEAR,-7);
Date dt = rightNow.getTime();
operationLogDao.deleteBeforeDatetime(new OperationLogDo().setDatetime(dt));
}
@Override
public int interval() {
return 12;
}
}

View file

@ -0,0 +1,37 @@
package com.ctrip.zeus.service.clean.impl;
import com.ctrip.zeus.dal.core.TaskDao;
import com.ctrip.zeus.dal.core.TaskDo;
import com.ctrip.zeus.service.clean.CleanFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.unidal.dal.jdbc.DalException;
import javax.annotation.Resource;
import java.util.Calendar;
import java.util.Date;
/**
* Created by fanqq on 2015/10/20.
*/
@Service("taskCleanFilter")
public class TaskCleanFilter implements CleanFilter {
@Resource
private TaskDao taskDao ;
Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void runFilter() throws Exception {
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(new Date());
rightNow.add(Calendar.DAY_OF_YEAR,-7);
Date dt = rightNow.getTime();
this.taskDao.deleteBeforeDatetime(new TaskDo().setCreateTime(dt));
}
@Override
public int interval() {
return 12;
}
}

View file

@ -24,6 +24,18 @@
]]>
</statement>
</query>
<query name="find-by-slb-id-and-max-version" type="SELECT">
<param name="slb-id"/>
<statement>
<![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='slb-id'/> = ${slb-id}
ORDER BY <FIELD name='version'/> DESC
LIMIT 1
]]>
</statement>
</query>
<query name="find-by-slb-id-and-version" type="SELECT">
<param name="slb-id"/>
<param name="version"/>
@ -47,6 +59,17 @@
]]>
</statement>
</query>
<query name="delete-by-slb-id-less-than-version" type="DELETE">
<param name="slb-id"/>
<param name="version"/>
<statement>
<![CDATA[
DELETE FROM <TABLE/>
WHERE <FIELD name='slb-id'/> = ${slb-id}
AND <FIELD name='version'/> < ${version}
]]>
</statement>
</query>
</query-defs>
</entity>
<entity name="nginx-conf-server" table="nginx_conf_server" alias="ncs">
@ -100,6 +123,18 @@
]]>
</statement>
</query>
<query name="find-by-slb-id-and-max-version" type="SELECT">
<param name="slb-id"/>
<statement>
<![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='slb-id'/> = ${slb-id}
ORDER BY <FIELD name='version'/> DESC
LIMIT 1
]]>
</statement>
</query>
<query name="delete-by-slb-id-from-version" type="DELETE">
<param name="slb-id"/>
<param name="version"/>
@ -111,6 +146,17 @@
]]>
</statement>
</query>
<query name="delete-by-slb-id-less-than-version" type="DELETE">
<param name="slb-id"/>
<param name="version"/>
<statement>
<![CDATA[
DELETE FROM <TABLE/>
WHERE <FIELD name='slb-id'/> = ${slb-id}
AND <FIELD name='version'/> < ${version}
]]>
</statement>
</query>
</query-defs>
</entity>
<entity name="nginx-conf-upstream" table="nginx_conf_upstream" alias="ncs">
@ -164,6 +210,18 @@
]]>
</statement>
</query>
<query name="find-by-slb-id-and-max-version" type="SELECT">
<param name="slb-id"/>
<statement>
<![CDATA[
SELECT <FIELDS/>
FROM <TABLE/>
WHERE <FIELD name='slb-id'/> = ${slb-id}
ORDER BY <FIELD name='version'/> DESC
LIMIT 1
]]>
</statement>
</query>
<query name="delete-by-slb-id-from-version" type="DELETE">
<param name="slb-id"/>
<param name="version"/>
@ -175,6 +233,17 @@
]]>
</statement>
</query>
<query name="delete-by-slb-id-less-than-version" type="DELETE">
<param name="slb-id"/>
<param name="version"/>
<statement>
<![CDATA[
DELETE FROM <TABLE/>
WHERE <FIELD name='slb-id'/> = ${slb-id}
AND <FIELD name='version'/> < ${version}
]]>
</statement>
</query>
</query-defs>
</entity>
<entity name="nginx-server" table="nginx_server" alias="ns">

View file

@ -77,6 +77,23 @@
<property name="repeatInterval" value="1000"/>
</bean>
<bean id="cleanManagerDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.ctrip.zeus.clean.CleanDbJob"/>
<property name="jobDataMap">
<map>
<entry key="cleanDbManager" value-ref="cleanDbManager" />
</map>
</property>
<property name="durability" value="true"/>
</bean>
<!-- Run the job every 1h = 60*60*1000=3600000 ms with initial delay of 1 second -->
<bean id="cleanManagerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="cleanManagerDetail"/>
<property name="startDelay" value="1000"/>
<property name="repeatInterval" value="3600000"/>
</bean>
<!-- Scheduler factory bean to glue together jobDetails and triggers to Configure Quartz Scheduler -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
@ -85,6 +102,7 @@
<ref bean="operationLogCleanDetail"/>
<ref bean="taskWorkerDetail"/>
<ref bean="taskCleanDetail"/>
<ref bean="cleanManagerDetail"/>
</list>
</property>
<property name="triggers">
@ -93,6 +111,7 @@
<ref bean="operationLogCleanTrigger"/>
<ref bean="taskWorkerTrigger"/>
<ref bean="taskCleanTrigger"/>
<ref bean="cleanManagerTrigger"/>
</list>
</property>
</bean>