quatz调度-手动终止线程(1) 创建触发器,线程执行完毕后添加到cleaner list
2024-10-08 05:52:57
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerBean;
import com.tdtech.eplatform.gatekeeper.listener.JobTriggerListener; public class QuartzCenter {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private QuartzUtil quartzUtil;
@Autowired
private Scheduler scheduler;
@Autowired
private JobTriggerListener jobTriggerListener; public String scheduleJob(Object targetObject, String targetMethod, int repeatCount, long repeatInterval, long startDelay) {
String jobName = quartzUtil.makeJobName(targetMethod);
try {
logger.info("scheduleJob jobname:"+jobName);
if(targetMethod != null && targetMethod.startsWith("run")){
scheduler.addTriggerListener(jobTriggerListener);
}
MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();
jobDetailFactoryBean.setTargetObject(targetObject);
jobDetailFactoryBean.setTargetMethod(targetMethod);
jobDetailFactoryBean.setName(jobName);
jobDetailFactoryBean.setConcurrent(false);
jobDetailFactoryBean.afterPropertiesSet();
SimpleTriggerBean simpleTriggerBean = new SimpleTriggerBean();
simpleTriggerBean.setBeanName(quartzUtil.makeTriggerBeanName(targetMethod));
simpleTriggerBean.setRepeatCount(repeatCount);
simpleTriggerBean.setRepeatInterval(repeatInterval);
simpleTriggerBean.setStartDelay(startDelay);
simpleTriggerBean.afterPropertiesSet();
if(targetMethod!=null && targetMethod.startsWith("run"))
{
simpleTriggerBean.addTriggerListener("conTriggerListener");
}
scheduler.scheduleJob((JobDetail) jobDetailFactoryBean.getObject(), simpleTriggerBean); } catch (Exception e) {
jobName = null;
logger.error("scheduleJob failed!", e);
}
return jobName;
} public boolean terminateJob(String jobName) {
if (jobName == null) {
return false;
}
try {
return scheduler.deleteJob(jobName, null);
} catch (Exception e) {
logger.error("terminate job failed![jobName] is " + jobName, e);
}
return false;
}
}
JobTriggerListener 触发器
import java.util.Date;
import org.quartz.JobExecutionContext;
import org.quartz.Trigger;
import org.quartz.TriggerListener;
public class JobTriggerListener implements TriggerListener { @Override
public String getName() {
return "conTriggerListener";
} @Override
public void triggerComplete(Trigger arg0, JobExecutionContext arg1, int arg2) { Date d = arg1.getNextFireTime();
String jobName = arg1.getJobDetail().getName();
if (d == null && jobName!=null && jobName.startsWith("run")) {
Cleaner.getInstance().put(arg1.getJobDetail().getName());
}
} @Override
public void triggerFired(Trigger arg0, JobExecutionContext arg1) {
} @Override
public void triggerMisfired(Trigger arg0) {
} @Override
public boolean vetoJobExecution(Trigger arg0, JobExecutionContext arg1) {
return false;
} }
//生成线程名 uuid
import com.fasterxml.uuid.Generators;
import com.fasterxml.uuid.NoArgGenerator; public class QuartzUtil {
/**
* 使用UUID避免生成重复的名称
* 影响程序性能,毕竟字符串比较非常耗时
*/
private final NoArgGenerator uuidGenerator = Generators.randomBasedGenerator(); public String makeJobName(String customName) {
return customName + "_" + uuidGenerator.generate().toString();
} public String makeTriggerBeanName(String customName) {
return customName + "_" + uuidGenerator.generate().toString();
} }
//业务流程
protected void disconnectChannel() { ...
String jobName = quartzCenter.scheduleJob(new CheckShouldCloseChannel(userDataIndex), "run", CHECK_CHANNEL_SHOULD_CLOSE_CNT - 1, 10000L, 10000L);
...
}
最新文章
- 四核exynos4412开发板使用网线上网注意事项
- 网页引用google字体速度慢:fonts.googleapis.com
- SAAS在中国市场的发展前景
- 中小公司PMO不一样期间的责任
- 【Web前端】---js调用本地应用程序
- MySql获取表的字段名称、字段注解、字段类型、字段长度
- linux常用命令:2权限管理命令
- WPF-控件-层级控件-Menu-嵌套结构
- Android Dialogs(6)Dialog类使用示例:用系统theme和用自定义的theme
- apparmor介绍
- JavaScript基础知识----六道有趣的Js基础题以及解答
- 一个博客总结的css常见的兼容性问题
- 如何给Ionic写一个cordova插件
- Entity Framework Core(EF Core) 最简单的入门示例
- python3+2 不换行打印,多用于进度条 process bar
- 在虚拟机上的ubuntu 1.6 系统中sudo apt-get失败的问题
- CSS实现元素水平垂直居中
- swift protocol 见证容器 虚函数表 与 动态派发
- Yahoo的Yslow23条规则
- docker打包centos增加中文支持
热门文章
- Springboot整合dubbo搭建基本的消费、提供和负载均衡
- 解决Keep-Alive 和 Close 不能使用此属性设置
- Java 基础 - 原生类型
- MySql学习笔记(一)之DQL常用查询
- UVA-11987-Almost Union-Find-并查集的基本操作合并、删除、移位
- HDU-1423-Greatest Common Increasing Subsequence-最长公共上升子序列【模版】
- sessionStorage 和 localStorage的区别
- day 66 Django基础二之URL路由系统
- day 60 Django基础七之Ajax
- MyBatis的核心API