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
② quartz+hibernate+spring 頻繁操作資料庫,出現 資料庫連接超過最大連接數
spring
quartz如何動態配置時間
1.
目的:動態設置時間,觸發相應的任務
2.
系統架構為
struts
+
spring
+
hibernate
3.
實現步驟:
在頁面上設置時間;
將時間轉換為unix
cron
expression;
將轉換後的時間規則表達式記錄到資料庫中(也可以寫...
③ quartz定時器問題,要往資料庫插入數據,報no session
定時器的資料庫腳本有沒有導入
給你看下我的配置
④ 如何在quartz的job任務中操作資料庫
資料庫中建表。建表模版在Quartz包下docs/dbTables下,選擇相應的資料庫和版本即可。ORACLE的11個Table列表如下:
QRTZ_JOB_LISTENERS:存儲有關已配置的 JobListener 的信息
JOB_NAME
JOB_GROUP
JOB_LISTENER
QRTZ_TRIGGER_LISTENERS:存儲已配置的 TriggerListener 的信息
QRTZ_FIRED_TRIGGERS:存儲與已觸發的 Trigger 相關的狀態信息,以及相聯 Job的執行信息
QRTZ_PAUSED_TRIGGER_GRPS:存儲已暫停的 Trigger 組的信息
QRTZ_SCHEDULER_STATE:存儲集群中note實例信息,quartz會定時讀取該表的信息判斷集群中每個實例的當前狀態
INSTANCE_NAME 之前配置文件中org.quartz.scheler.instanceId配置的名字,就會寫入該欄位,如果設置為AUTO,quartz會根據物理機名和當前時間產生一個名字
LAST_CHECKIN_TIME:上次檢查時間
CHECKIN_INTERVAL :檢查間隔時間
QRTZ_LOCKS:存儲程序的悲觀鎖的信息(假如使用了悲觀鎖)
QRTZ_SIMPLE_TRIGGERS:存儲簡單的Trigger,包括重復次數,間隔,以及已觸的次數
TRIGGER_NAME :qrtz_triggers表trigger_name的外鍵
TRIGGER_GROUP:qrtz_triggers表trigger_group的外鍵
REPEAT_COUNT :重復次數
REPEAT_INTERVAL:時間間隔
TIMES_TRIGGERED:觸發次數
QRTZ_CRON_TRIGGERS:存儲cron表達式表
TRIGGER_NAME :qrtz_triggers表trigger_name的外鍵
TRIGGER_GROUP:qrtz_triggers表trigger_group的外鍵
CRON_EXPRESSION:cron表達式
TIME_ZONE_ID :時區
QRTZ_TRIGGERS:保存trigger信息
⑤ 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、啟動項目,查看控制台列印的日誌,成功