⑴ Quartz数据库动态定时器Repeat count must be >= 0
引用 11 楼差凯 zhujia 的回复:貌似把那个timer弄成静态变量,在全局里面hold住就不会被回收了 引用 6 楼 ... 方法内写如下代败庆旁察橡码:System.Timers.Timer objTimer = new System.Timers.Timer();objTimer.Interval = 时间; //这个时...
⑵ quartz 怎么通过数据库设置
可以做个动态的任务管理
⑶ spring 4 quartz 2.x动态配置triggers
spring 4.x没有配置过,这里有一个spring 3.x 的quartz定时配置,你参考参考:
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!--
1、JobDetail:JobDetail是一个具体的类。
2、Trigger:触发器,它用于定义Job何时执行。最常用的是SimpleTrigger和CronTrigger。
一般来说,如果你需要在一个固定的时间和重复次数或者一个固定的间隔时间,那么SimpleTrigger比较合适;
如果你有许多复杂的作业调度,那么CronTrigger比较合适。
CronTrigger和Unix的cron机制基本一样,我们需要的只是一个cron表达式。
比如“0012**?”会在每天中午12点触发执行;“01510槐嫌?*6L”会在每个月的最后一个星期五的早上10:15触发Job执行。
铅态手3、Scheler和SchelerFactory:Scheler负责管理Trigger、调度Job,
SchelerFactory则是Scheler工厂,负责生成Scheler。
-->
<!--总管理类如果将lazy-init='false'那么容器启动就会执行调度程序-->
<beanclass="org.springframework.scheling.quartz.SchelerFactoryBean"lazy-init="false">
<!--通过属性配置spring上下文[此属性可省略]-->
<propertyname="">
<value>applicationContext</value>
</property>
<propertyname="triggers">
<list>
<!--作业调度器,list下可加入其他的调度器-->
<refbean="testTrigger"/>
</list>
</property>
<propertyname="autoStartup"value="true"/>
</bean>
<!--要调度的对象-->
<beanid="testJob"class="name.zealze.test.JobTest"/>
<beanid="testTrigger"class="org.springframework.scheling.quartz.CronTriggerBean">
<propertyname="jobDetail"ref="testJobDetail"/>
<!--按cron表达式时间点触发事件http://cron.qqe2.com/-->
<propertyname="cronExpression"value="00/2***?"/>
</bean>
<beanid="testJobDetail"class="org.springframework.scheling.quartz.">
<propertyname="targetObject"ref="testJob"/>
<propertyname="targetMethod"value="execute"/>
<!--是否允许任务闭销并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程-->
<propertyname="concurrent"value="false"/>
</bean>
</beans>
⑷ 如何在quartz的job任务中操作数据库
quartz定时任务时间
<?xml version="1.0" encoding="UTF-8"?>
<quartz xmlns="http://www.opensymphony.com/quartz/JobSchelingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" overwrite-existing-jobs="true">
<job>
<job-detail>
<name>sendMail</name>
<group>default</group>
<description>定时发送邮件提配</description>
<job-class>com.longing.mail.SendMailJob</job-class>
<job-data-map allows-transient-data="true">
<entry>
<key>url</key>
<value>http://localhost/userSites/gat/index.jsp</value>
</entry>
<entry>
<key>destPath</key>
<value>\\default.html</value>
</entry>
<entry>
<key>chartset</key>
<value>utf-8</value>
</entry>
<entry>
<key>Strat</key>
<value>true</value>
</entry>
</job-data-map>
</job-detail>
<trigger>
<cron>
<name>hourTaskJob-trigger</name>
<group>default</group>
<job-name>sendMail</job-name>
<job-group>default</job-group>
<cron-expression>0 0 16 * * ?</cron-expression>
</cron>
</trigger>
</job>
</quartz>
package com.longing.mail;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class SendMailJob implements Job{
public static synchronized boolean start(String page, String filePath,
String chartset) throws Exception {
System.out.print("发送邮件");
MailDo.sendHtmlMail("[email protected]", "恭喜您,成功注册为ISS OA企业用户", "恭喜您,注册成功");
return true;
}
public void execute(JobExecutionContext jeCtx) throws JobExecutionException {
//String page=jeCtx.getJobDetail().getJobDataMap().getString("url");
//String filePath=jeCtx.getJobDetail().getJobDataMap().getString("destPath");
//String chartset="utf-8";
try {
SendMailJob.start("", "", "");
} catch (Exception e) {
e.printStackTrace();
}
}
}
⑸ springboot+quartz持久化到数据库各表含义
1、去quartz官网下载quartz2.2.2版本的压缩包,quartz下载,注意:quartz2.3.0版本的在docs目录下没有发现dbtable目录(存放生成数据库表的sql文件的目录)。
2、做纤执行创建数据库表的sql文件,我使用的是mysql数据库。
生成的表结构
3、在springboot项目中配置quartz。
3.1、两种方式配置quartz,
3.1.1、第一种是使用自定义的quartz.properties,这是简单配置,如果有其他配置可以参考,quartz.properties配烂颤置详情
org.quartz.jobStore.useProperties:true
#org.quartz.scheler.instanceName: quartzScheler
#org.quartz.scheler.instanceId = AUTO
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 15
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.: true
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.isClustered = false
#org.quartz.jobStore.clusterCheckinInterval=20000
org.quartz.jobStore.tablePrefix = qrtz_
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.maxMisfiresToHandleAtATime = 20
org.quartz.scheler.rmi.export: false
org.quartz.scheler.rmi.proxy: false
org.quartz.scheler.: false
登纯历仿录后复制
3.1.2、使用配置文件配置springboot中的SchelerFactoryBean。
@Configuration
public class SchelerConfig implements SchelerFactoryBeanCustomizer {
@Autowired
private DataSource dataSource;
@Override
public void customize(SchelerFactoryBean schelerFactoryBean) {
schelerFactoryBean.setStartupDelay(10);
schelerFactoryBean.setOverwriteExistingJobs(true);
schelerFactoryBean.setDataSource(dataSource);
ClassPathResource resource = new ClassPathResource("quartz.properties");
Properties properties = new Properties();
InputStream in= null;
try {
in = resource.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(in, "UTF-8"));
properties.load(bf);
schelerFactoryBean.setQuartzProperties(properties);
} catch (IOException e) {
e.printStackTrace();
}
}
}
登录后复制
3.2.1、第二种方式是在application.properties文件中的配置,application.properties文件中的spring.quartz.properties. 加上quartz.properties中的键值对,效果与quartz.properties类似。
spring.quartz.properties.org.quartz.jobStore.tablePrefix = qrtz_
spring.quartz.properties.org.quartz.threadPool.threadCount = 10
登录后复制
项目中配置org.quartz.jobStore.tablePrefix = qrtz_,这个配置是默认查询数据库中表的前缀,默认是QRTZ_,以下sql中通过rpt方法组装一条新的sql,替换掉{0},{1},如果没有明确声明就会使用默认值 org.quartz.jobStore.tablePrefix = QRTZ_,org.quartz.scheler.instanceName: quartzScheler。
如果进行简单的定时任务,可以使用springboot中默认的quartz配置。
3.2.2 自定义配置springboot中的SchelerFactoryBean。
@Configuration
public class SchelerConfig implements SchelerFactoryBeanCustomizer {
@Autowired
private DataSource dataSource;
@Override
public void customize(SchelerFactoryBean schelerFactoryBean) {
schelerFactoryBean.setStartupDelay(10);
schelerFactoryBean.setOverwriteExistingJobs(true);
schelerFactoryBean.setDataSource(dataSource);
}
}
登录后复制
4、新建Job
public class TestJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println(System.nanoTime());
}
}
登录后复制
5、数据库中新增job任务脚本,com.example.quartzdemo.job.TestJob是我本地的测试Job,需要修改成你自己Job类。
INSERT INTO `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `JOB_CLASS_NAME`, `IS_DURABLE`, `IS_NONCONCURRENT`, `IS_UPDATE_DATA`, `REQUESTS_RECOVERY`, `JOB_DATA`) VALUES ('quartzScheler', 'test2Job', 'testGroup', NULL, 'com.example.quartzdemo.job.TestJob', '1', '0', '0', '0', NULL);
INSERT INTO `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `NEXT_FIRE_TIME`, `PREV_FIRE_TIME`, `PRIORITY`, `TRIGGER_STATE`, `TRIGGER_TYPE`, `START_TIME`, `END_TIME`, `CALENDAR_NAME`, `MISFIRE_INSTR`, `JOB_DATA`) VALUES ('quartzScheler', 'testTrigger2', 'testTriggerGroup', 'test2Job', 'testGroup', NULL, '1554122914000', '1554122913000', '5', 'ACQUIRED', 'CRON', '1554039857000', '0', NULL, '0', NULL);
INSERT INTO `qrtz_cron_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `CRON_EXPRESSION`, `TIME_ZONE_ID`) VALUES ('quartzScheler', 'testTrigger2', 'testTriggerGroup', '0/1 * * * * ?', 'Asia/Shanghai');
登录后复制
6、启动项目,查看控制台打印的日志,成功
⑹ quartz可以实现同时执行一千个任务这样的需求吗
你的问题我想分两部分回答:
1.quartz有数据库方式保存job,以及触发器这些数据的
具体可以看我的一篇blog:
quartz数据库方式与web工程整合
里面还有一个中文版的quartz的指南,可以帮你搞定数据库方式的quartz
2.至于你说的1000个触发器,这么多的任务调度我没咐宴做过,不清楚结衡念银果会高液怎么样,这部分还需要再研究一下。
转载
⑺ quartz2.2 不按规定时间执行,有人遇到过吗
应该是抛弃吧 等待下一个时间点执行! 我的做法是将没有执行或执行失败的任务记录下来,然后写一个定时任务,去执行没有完成的任务。
在quartz的数据库中 表QRTZ_TRIGGERS
中记毁液录了陆饥任务的执行时间,可以利用这早余返个做个试验或者对你的程序做些处理
⑻ quartz如何通过数据库动态调用时间
quartz 是头像插件,能帮你监控下BUFF和DEBUFF。是不能监控的你陷阱时间的。
只能另外找其它插件。大脚插件包里有的。
如果装大脚。你要把大脚的头像增强关掉
⑼ quartz+hibernate+spring 频繁操作数据库,出现 数据库连接超过最大连接数
spring
quartz如何动态来配源置时间
1.
目的:动态设置时间,触发相应的任务
2.
系统架构为
struts
+
spring
+
hibernate
3.
实现步骤:
在页面上设置时间;
将时间转换为unix
cron
expression;
将转换后的时间规则表达式记录到数据库中(也可以写...
⑽ spring配置quartz后怎么访问数据库
quartz定时任务配置:
<bean id="scheler"
class="org.springframework.scheling.quartz.SchelerFactoryBean">
<property name="triggers">
<list>
<ref bean="ActionCronTrigger"/>
<ref bean="ActionOrderCronTrigger"/>
<ref bean="InquiryCronTrigger"/>
</list>
</property>
</bean>
其中:
<ref bean="ActionCronTrigger"/>
<ref bean="ActionOrderCronTrigger"/>
<ref bean="InquiryCronTrigger"/>
配置对应的定时任务,可配置多个,名称要唯一,对应的是第二步中配置的CronTriggerFactoryBean
CronTriggerFactoryBean配置,由于要实现动态读取定时任务周期时间,所以我们要写一个类实现CronTriggerFactoryBean,类的内容如下:
public class InitCronTriggerFactoryBean extends CronTriggerFactoryBean implements Serializable {
private static final long serialVersionUID = 1L;
private SysParamServiceImpl sysParamServiceImpl;
private String key;
public void setKey(String key)
{
this.key = key;
}
public void setSysParamServiceImpl(SysParamServiceImpl sysParamServiceImpl)
{
this.sysParamServiceImpl = sysParamServiceImpl;
setCronExpression(getCronExpressionFromDB());
}
private String getCronExpressionFromDB()
{
if(StringUtils.isEmpty(key))
return "0 0 0/1 * * ?";
SysParam sysParam = new SysParam();
try
{
sysParam = sysParamServiceImpl.getNameByKey(key);
}
catch (Exception e)
{
e.printStackTrace();
}
if(sysParam != null && !StringUtils.isEmpty(sysParam.getParamValue()))
return sysParam.getParamValue();
return "0 0 0/1 * * ?";
}
}
简单说明一下:key是用来查询数据库配置的CronExpression表达式的查询条件,SysParamServiceImpl 是实现查询的类,这几个参数都要从spring配置的CronTriggerFactoryBean参数获取,注意,配置的时候,key值的配置要在SysParamServiceImpl 的配置之前,否则报空指针
spring配置CronTriggerFactoryBean:
实现了CronTriggerFactoryBean之后,开始配置CronTriggerFactoryBean,现在配置的是InitCronTriggerFactoryBean :
<bean id="InquiryCronTrigger" class="cn.com.shopec.quartz.utils.InitCronTriggerFactoryBean">
<property name="jobDetail" ref="InquiryJobDetail" />
<property name="key" value="inquiryQuartzParam" />
<property name="sysParamServiceImpl" ref="sysParamServiceImpl" />
</bean>
id对应quartz定时任务配置的<ref bean="InquiryCronTrigger"/>,参数有三个,第二个和第三个是InitCronTriggerFactoryBean设置内容需要的,第一个<property name="jobDetail" ref="InquiryJobDetail" />则是定时任务执行业务逻辑的类
ps:<property name="sysParamServiceImpl" ref="sysParamServiceImpl" />,这个要配置对应的bean,我的是
<bean id="sysParamServiceImpl" class="cn.com.shopec.core.system.service.impl.SysParamServiceImpl">
</bean>
配置对应的定时任务执行业务方法的类:
<bean id="InquiryJobDetail"
class="org.springframework.scheling.quartz.JobDetailFactoryBean">
<property name="rability" value="true" />
<property name="jobClass" value="cn.com.shopec.quartz.utils.InquiryQuartz" />
<property name="jobDataAsMap">
<map>
<entry key ="inquiryServiceImpl" value-ref="inquiryServiceImpl"/>
</map>
</property>
</bean>
简单说明一下:<property name="jobClass" value="cn.com.shopec.quartz.utils.InquiryQuartz" />配置的是你需要定时执行的类,<property name="jobDataAsMap"> 下面配置的是定时执行类中需要用到的其他类,这是由于项目启动执行定时任务不能在定时任务类中实例化这些类,要配置才行。
对应的定时任务执行类:
public class InquiryQuartz extends QuartzJobBean {
@Autowired
private InquiryServiceImpl inquiryServiceImpl;
@Override
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException
{
// 实例化接口
inquiryServiceImpl = (InquiryServiceImpl) arg0.getJobDetail().getJobDataMap().get("inquiryServiceImpl");
// 执行业务方法
quartzStart();
}
public void quartzStart(){
// 业务方法...
}
}
说明一下:必须要实现QuartzJobBean 接口
至此,就可以完成可配置CronExpression表达式的定时任务了!1