quatz调度-手动终止线程(1) 创建触发器,线程执行完毕后添加到cleaner list
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);
...
}
quatz调度-手动终止线程(1) 创建触发器,线程执行完毕后添加到cleaner list的更多相关文章
- quatz调度-手动终止线程(2) Cleaner线程做清理工作
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import ja ...
- day33 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁
今日内容: 1.线程理论 2.锁: 牺牲了效率,保证了数据的安全(重点) 3.守护线程 4.GIL锁:(重点) 5.计算密集型和IO密集型 6.信号量,事件(了解) 7.补充. 子进程中不能input ...
- Java如何判断线程池所有任务是否执行完毕
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Tes ...
- C# 本进程执行完毕后再执行下一线程
最近做了一套MES集成系统,由上料到成品使自动化运行,其中生产过程是逐步的,但是每一个动作都需要独立的线程进行数据监听,那么就需要实现线程等待. 代码: using System; using Sys ...
- 解决Java线程池任务执行完毕后线程回收问题
转载请注明出处:http://www.cnblogs.com/pengineer/p/5011965.html 对于经常使用第三方框架进行web开发的程序员来说,Java线程池理所 ...
- MFC 线程的创建,线程函数在类内、类外
[线程的创建] AfxBeginThread(类外的线程函数,NULL); AfxBeginThread(类内的线程函数,(LPVOID)this); [类外线程函数] UINT 函数名(LPVOID ...
- Java主线程在子线程执行完毕后再执行
一.join() Thread中的join()方法就是同步,它使得线程之间由并行执行变为串行执行. public class MyJoinTest { public static void main( ...
- jQuery 如何先创建、再修改、后添加DOM元素
例如顺序执行[创建]-> [修改]-> [添加]三个动作. 由于jQuery支持链式操作,其实就是设计模式的builder模式,所以我们可以把三个操作串在一起来执行. 首先创建一个p元素, ...
- 并发编程8 线程的创建&验证线程之间数据共享&守护线程&线程进程效率对比&锁(死锁/递归锁)
1.线程理论以及线程的两种创建方法 2.线程之间是数据共享的与join方法 3.多线程和多进程的效率对比 4.数据共享的补充线程开启太快 5.线程锁 互斥锁 同步锁 6.死锁现象和递归锁 7.守护线程 ...
随机推荐
- (十七)从UML角度来理解依赖
UML软件建模 什么是依赖?简单理解就是一个类A用到了类B,但是这种使用关系是偶然性的.临时性的.非常弱的,类B的变化会影响到类A 显示依赖与隐式依赖 依赖倒置:我们要依赖于高层业务,不依赖于低层业务 ...
- 2018-8-10-使用-IncrediBuild-提升-VisualStudio-编译速度
title author date CreateTime categories 使用 IncrediBuild 提升 VisualStudio 编译速度 lindexi 2018-08-10 19:1 ...
- JS事件 编程练习-自制计算器 使用JS完成一个简单的计算器功能。实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除。
编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...
- Java 异常基本结构
异常的定义:阻止当前方法或作用域继续执行的情况,即程序无法正常执行下去称之为异常. 异常的基本结构: 所有不正常的类都继承与Throwable类,包括Error类和Exception类 Error一般 ...
- php数组的快速排序
function quick($array){ if(count($array)<=1){ return $array; } $key=$array[0]; $right=array(); $l ...
- thinkphp 跳转和重定向
页面跳转 在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面.系统的\Think\Controller类内置了两个跳转方法success和 ...
- duilib教程之duilib入门简明教程6.XML配置界面
前面那些教程都是为了让小伙伴们从win32.MFC过渡到duilib,让大家觉得duilib不是那么陌生,如果大家现在还对duilib非常陌生的话,那就说明前面的教程做得不好,请大家在下面留言,我会一 ...
- echarts renderItem-在区间段内展示连续数据
一.需求背景: 贴图说明:要求数据在不同类型的区间段内展示. 二.实现思路及代码 实现方法: 利用echarts的自定义配置:option.series[i].type='custom'中的rende ...
- android—退出应用程序
在android系统中,当你点击返回按钮时,会默认调用finish方法(还是destroy方法,记不太清楚),这样你就能退出当前Activity.注意是当前Activity,不是应用程序,因为如果这个 ...
- NTT FWT(xor or and) 模板
void nnt(int a[],int len,int on) { ;i<len;i++) if(i<r[i]) swap(a[i],a[r[i]]); ;i<len;i<& ...