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的更多相关文章

  1. quatz调度-手动终止线程(2) Cleaner线程做清理工作

    import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import ja ...

  2. day33 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

    今日内容: 1.线程理论 2.锁: 牺牲了效率,保证了数据的安全(重点) 3.守护线程 4.GIL锁:(重点) 5.计算密集型和IO密集型 6.信号量,事件(了解) 7.补充. 子进程中不能input ...

  3. Java如何判断线程池所有任务是否执行完毕

    import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Tes ...

  4. C# 本进程执行完毕后再执行下一线程

    最近做了一套MES集成系统,由上料到成品使自动化运行,其中生产过程是逐步的,但是每一个动作都需要独立的线程进行数据监听,那么就需要实现线程等待. 代码: using System; using Sys ...

  5. 解决Java线程池任务执行完毕后线程回收问题

      转载请注明出处:http://www.cnblogs.com/pengineer/p/5011965.html         对于经常使用第三方框架进行web开发的程序员来说,Java线程池理所 ...

  6. MFC 线程的创建,线程函数在类内、类外

    [线程的创建] AfxBeginThread(类外的线程函数,NULL); AfxBeginThread(类内的线程函数,(LPVOID)this); [类外线程函数] UINT 函数名(LPVOID ...

  7. Java主线程在子线程执行完毕后再执行

    一.join() Thread中的join()方法就是同步,它使得线程之间由并行执行变为串行执行. public class MyJoinTest { public static void main( ...

  8. jQuery 如何先创建、再修改、后添加DOM元素

    例如顺序执行[创建]-> [修改]-> [添加]三个动作. 由于jQuery支持链式操作,其实就是设计模式的builder模式,所以我们可以把三个操作串在一起来执行. 首先创建一个p元素, ...

  9. 并发编程8 线程的创建&验证线程之间数据共享&守护线程&线程进程效率对比&锁(死锁/递归锁)

    1.线程理论以及线程的两种创建方法 2.线程之间是数据共享的与join方法 3.多线程和多进程的效率对比 4.数据共享的补充线程开启太快 5.线程锁 互斥锁 同步锁 6.死锁现象和递归锁 7.守护线程 ...

随机推荐

  1. CentOS增加swap分区大小

    来自:http://www.centoscn.com/CentOS/Intermediate/2014/0222/2446.html 1. 查看当前分区情况 free -m 2. 增加 swap 大小 ...

  2. java_函数式编程

    创建函数式接口: //定义了一个函数式接口 @FunctionalInterface public interface BlogTest { /* 函数式接口: 概念:有且仅有一个抽象方法的接口 接口 ...

  3. Java常用文件下载与查找的URL

    Java JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html Tomcat: http://tomcat.a ...

  4. Leetcode274.H-IndexH指数

    原题的中文翻译不是很好,所以给出英文版. Given an array of citations (each citation is a non-negative integer) of a rese ...

  5. BCZM : 1.4

    书店促销活动,某套书一共有五卷.假设每一卷单独销售均需8欧元,多买则有折扣,具体折扣如下:    2 5%    3 10%    4 20%    5 25%    设计算法,计算出读者购买一批书的 ...

  6. 取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏

    取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏,在MainActivity中添加以下代码: getWindow().clearFlags(WindowManager.LayoutP ...

  7. (转)SQL盲注攻击的简单介绍

    转:http://hi.baidu.com/duwang1104/item/65a6603056aee780c3cf2968 1 简介     1.1 普通SQL注入技术概述     目前没有对SQL ...

  8. 类的反射实例(servlet的抽取)

    类的反射实例 具体以后我们写的时候不用写BaseServlet,因为各种框架都已经给我们写好了 所以,user对应的servlet的界面长这样:

  9. Sublime Text 3,有了Anaconda就会如虎添翼

    作为Python开发环境的Sublime Text 3,有了Anaconda就会如虎添翼.Anaconda是目前最流行也是最有威力的Python代码提示插件. 操作步骤 1.打开package con ...

  10. python相关小技巧整理[持续更新]

    1. pdb的非常方便的debug,抛弃print吧~ 参考https://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/ impor ...