Spring整合Quartz,并发阻塞问题

转自:http://blog.csdn.net/hongweigg/article/details/6188238      

Quartz多任务阻塞原因:

        Quartz 调度器以多线程的方式执行调度任务JobDetail,缺省线程池大小为10,也就是说若调度器中已有10个Job在工作(线程没有结束),那么即使有JobDetail到了被触发的时间,新的JobDetail不会被执行,也就是说阻塞的条件是,调度器中正在运行的JobDetail数量达到了设定值10。

举一个具体的例子:

a. 单一Job

配置:

JobA 触发时间为 每秒运行一次,每个Job执行时间为30秒

运行:

1、 10个JobA将连续启动

2、 到第10个JobA启动后,线程池中所有线程被耗尽,调度器出现了阻塞,即没有新的JobA启动,尽管设置为每秒执行一次。

3、30秒后,将有1个以上JobA执行完毕,在短时间内,新的10个JobA又被启动,再次进入2的阻塞状态

    2状态可以称做调度器阻塞状态,没有新的Job能执行,导致一些诸如定时读取数据的操作无法继续下去。除非有JobA执行完毕,新的JobA才能被执行。实际运行中,假设调度器中有一个JobA线程的执行时间大于两次启动间隔,则经过若干次操作后,将耗尽所有10个线程资源,导致其他的调度任务阻塞。

b. 多个Job(无状态Job)

    在这个测试中,可以有多种不同的Job(无状态Job),但它们均共享这10个线程,任何一个Job 线程执行时间大于两次启动间隔均有可能导致调度器被阻塞。例如:

配置:

JobA 触发时间为 每秒运行一次,每个Job执行时间为30秒;JobB 触发时间为每秒运行一次,每次执行时间小于1秒

运行:

1。JobA和JobB相继启动

2。几秒钟后JobA数量达到10,其间JobB被执行若干次,则新的JobA和JobB均不能被启动,调度器进入阻塞状态

3。30秒后,JobA(0-9)相继执行完毕,新的JobA和JobB均有机会被重新启动,短时间内,再次进入2的阻塞状态

如何解决调度器阻塞问题?

1、 延长可能需要较长时间执行的JOB的时间间隔,假设Job执行时间最大时间为t1, 两次任务执行间隔调度时间为d1, 则d1>t1

2、 使用有状态调度任务StatefulJob代替没有状态的Job. 对于要求执行间隔时间尽可能短,又不希望造成阻塞的比较适合。可以同时有无状态的调度任务JobA,和有状态的调度任务JobB,JobB堵塞后不会对JobA造成影响,即读报文的任务阻塞了,不会对调度器中其他任务造成影响,同时JobA执行完后,可再次继续下一个任务。

    如果JobA执行时间较长的话,可能造成JobA始终占用一个线程资源。

3、注意:一个调度器中如果有很多个Job(JobA,JobB,JobC...),其中有一个很容易堵塞,则该Job也会造成其他的Job阻塞

线程池大小配置在org.quartz下的quartz.properties文件中

org.quartz.threadPool.threadCount = 10

如若要修改线程池的大小,可以修改该文件中的 org.quartz.threadPool.threadCount值。亦可建一org.quartz包,包下放置quartz.properties文件,覆盖掉quartz.jar中的配置

但是,修改线程池的大小并不能解决调度器阻塞问题,因为资源消耗的速度不及资源释放的速度时,资源就会被耗尽。

=========================================并发问题====================================

转自:http://blog.csdn.net/flyflyflyflyflyfly/article/details/41870489

1、quartz默认是多线程的,如果执行任务的对象不是单例的,则每个线程都会产生任务对象,这些任务对象的同时执行可能会导致并发问题

2、quartz.properties配置文件是可以自己建的,建好后通过scheduler = new StdSchedulerFactory(QUARTZ_CONFIG_PATH).getScheduler();即可生成按照自己配置文件配置的Scheduler

3、concurrent字段的含义是指如果一个线程的任务没执行完,concurrent=true表示新开一个线程,concurrent=flase表示等待当前线程执行完毕,跟单线程、多线程没关系

4、顺便说下类锁、对象锁的问题,加类锁,即静态锁,就是一个类一个锁,该类产生的所有对象在多线程访问时,同时只能一个线程访问加了synchronized的代码块,而对象锁则是,一个对象一个锁,多线程同时只有一个线程访问该对象加synchronized的代码块,跟其他对象无关,其他对象也同时可以有线程访问

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给你一些关于Spring整合Quartz的指导。 首先,确保你已经添加了QuartzSpring依赖。接下来,我们需要在Spring中配置Quartz Scheduler。这可以通过在Spring配置文件中定义一个SchedulerFactoryBean来实现。下面是一个示例配置: ``` <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="transactionManager" /> <property name="overwriteExistingJobs" value="true" /> <property name="autoStartup" value="true" /> <property name="quartzProperties"> <props> <prop key="org.quartz.scheduler.instanceName">myScheduler</prop> <prop key="org.quartz.scheduler.instanceId">AUTO</prop> <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop> <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.oracle.OracleDelegate</prop> <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop> <prop key="org.quartz.jobStore.isClustered">true</prop> <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> <prop key="org.quartz.threadPool.threadCount">10</prop> </props> </property> </bean> ``` 在这个配置中,我们定义了一个SchedulerFactoryBean,并设置了一些属性,如数据源、事务管理器、Quartz属性等。这些属性可以根据你的具体需求进行修改。 接下来,我们需要定义一个JobDetail和Trigger。JobDetail描述了要执行的任务,Trigger描述了任务的执行计划。下面是一个示例配置: ``` <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.example.MyJob" /> <property name="durability" value="true" /> </bean> <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobDetail" /> <property name="cronExpression" value="0 0/5 * * * ?" /> </bean> ``` 在这个配置中,我们定义了一个MyJob类作为JobDetail的任务,定义了一个CronTrigger,每5分钟执行一次。 最后,我们需要将JobDetail和Trigger注册到Scheduler中,可以通过在Spring配置文件中定义一个SchedulerFactoryBean来实现。下面是一个示例配置: ``` <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="scheduler" ref="schedulerFactory" /> <property name="overwriteExistingJobs" value="true" /> <property name="jobDetails"> <list> <ref bean="jobDetail" /> </list> </property> <property name="triggers"> <list> <ref bean="trigger" /> </list> </property> </bean> ``` 在这个配置中,我们将JobDetail和Trigger注册到Scheduler中,并启动Scheduler。 这些就是Spring整合Quartz的基本配置步骤。希望这些信息能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值