quartz并发(小结)

quartz并发(总结)

1.http://blog.****.net/pdw2009/article/details/50195639

 

 

Your job class needs to implement StatefulJob, or alternatively, if you are using Quartz 2.x, be annotated with @DisallowConcurrentExecution.

This is how concurrent execution can be controlled in Quartz, and in particular MethodInvokingJobDetailFactoryBean just uses different job classes depending on the value of concurrent.

 
quartz job有时我们希望当前的job执行后,再执行下次的job,有两种方法可实现
1、job类实现StatefulJob接口
2、 在job类前加上@DisallowConcurrentExecution



有时我们不希望程序一次动就执行job等 待下次触发,在quartz.properties中加上:
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true

 

 

 

 

2.https://my.oschina.net/liujiawan/blog/503697?p={{page}}

 

在执行定时任务的时候,把定时任务的时间设置为10分钟执行一次,由于数据量很大,第一个十分钟还没执行结束,第二个十分钟已经开始了,这样就造成了并发,但是又不想用

java中的锁,这样很纠结,在网上找了好多资料

其实很简单,我们只要在detail的参数里加上一句话就行了,把这个job设置成有状态的job

<property name="concurrent" value="false" /> ③ 指定最终封装出的任务是否有状态

通过concurrent属性指定任务的类型,默认情况下封装为无状态的任务,如果希望目标封装为有状态的任务,仅需要将concurrent设置为false就可以了。Spring通过名为concurrent的属性指定任务的类型,能够更直接地描述到任务执行的方式(有状态的任务不能并发执行,无状态的任务可并发执行)

 

 

 

3.http://blog.****.net/tiantangpw/article/details/41120137

 

 

 

4.https://zhidao.baidu.com/question/414090365.html

 

在执行的方法入口加一个锁呗,每次进入的时候判断一下是否已锁就行了。job还是5分钟调一次。
 
追问
如何来实现呢?
 
追答
public class Job {
	private Object lock = new Object();
                private volatile boolean isRunning = false;
	public void run() {
			synchronized(lock) {
			if(isRunning ){
				return;
			}
	
			isRunning = true; 
                                               //执行。。。
                           isRunning = false; 

		}
          }

 

 

5.http://www.oschina.net/question/436266_129634%3Fsort%3Dtime?sort=time

不并发有两种方式:

1、使用spring xml配置,对jobDetail bean的concurrent属性设置为false;(隐约记得不写默认好像也是false)(推荐)

2、将job设置成有状态,即继承statefuljob接口。这个比较麻烦,不推荐使用。

3、或者将quartz properties配置中的连接池大小,改为1,这样肯定就不能并行(不推荐)

4、可以使用类静态变量标识是否当前job正在运行

 

6.

 

 

7.