在ABP框架中使用Quartz做background job
具体引用什么包,可以参考Background Jobs Quartz | Documentation Center | ABP.IO
由于读写不是那么多,就准备使用sqlite 作为数据库使用。
更新下:在使用sqlite时遇到lock问题(比如登陆时)解决方案
在ConfigureService中配置下:
Configure
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
配置的时候遇到了点问题
由于采用的是上面链接介绍的第二种配置方式
PreConfigure(options =>
{
options.Configurator = configure =>
{
configure.UsePersistentStore(storeOptions =>
{
storeOptions.UseProperties = true;
storeOptions.UseJsonSerializer();
storeOptions.UseSqlite(configuration.GetConnectionString("Quartz"));
});
};
});
结果发现有点问题。
经过一番调试(查看quartz源码,和Windows日志事件发现是配置有问题)和翻看别人的配置
storeOptions.UseSqlite(configuration.GetConnectionString("Quartz"));改成了
storeOptions.UseMicrosoftSQLite(configuration.GetConnectionString("Quartz"));
经过日志查看,UseSqlite需要引入System.Data.SQLite
而我已经通过引入Volo.Abp.EntityFrameworkCore.Sqlite引入了
Microsoft.EntityFrameworkCore.Sqlite
数据库配置字符支持2中
"ConnectionStrings": {
"Quartz": "Filename=./xxxx.sqlite"
},
或者
"ConnectionStrings": {
"Quartz": "Data Source=./xxxx.sqlite"
},
或者
"ConnectionStrings": {
"Quartz": "Data Source=.\\xxx.sqlite"
},
重要的是,一定要在sqlite中先创建相关的表
相关的sql代码在quartz.net 源码中,这里转载过来的。注意在有的工具里以下语句可能被被报错,那就换个工具,我是在sqlite studio里执行的。
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;
CREATE TABLE QRTZ_JOB_DETAILS
(
SCHED_NAME NVARCHAR(120) NOT NULL,
JOB_NAME NVARCHAR(150) NOT NULL,
JOB_GROUP NVARCHAR(150) NOT NULL,
DESCRIPTION NVARCHAR(250) NULL,
JOB_CLASS_NAME NVARCHAR(250) NOT NULL,
IS_DURABLE BIT NOT NULL,
IS_NONCONCURRENT BIT NOT NULL,
IS_UPDATE_DATA BIT NOT NULL,
REQUESTS_RECOVERY BIT NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
);
CREATE TABLE QRTZ_TRIGGERS
(
SCHED_NAME NVARCHAR(120) NOT NULL,
TRIGGER_NAME NVARCHAR(150) NOT NULL,
TRIGGER_GROUP NVARCHAR(150) NOT NULL,
JOB_NAME NVARCHAR(150) NOT NULL,
JOB_GROUP NVARCHAR(150) NOT NULL,
DESCRIPTION NVARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT NULL,
PREV_FIRE_TIME BIGINT NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE NVARCHAR(16) NOT NULL,
TRIGGER_TYPE NVARCHAR(8) NOT NULL,
START_TIME BIGINT NOT NULL,
END_TIME BIGINT NULL,
CALENDAR_NAME NVARCHAR(200) NULL,
MISFIRE_INSTR INTEGER NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
);
CREATE TABLE QRTZ_SIMPLE_TRIGGERS
(
SCHED_NAME NVARCHAR(120) NOT NULL,
TRIGGER_NAME NVARCHAR(150) NOT NULL,
TRIGGER_GROUP NVARCHAR(150) NOT NULL,
REPEAT_COUNT BIGINT NOT NULL,
REPEAT_INTERVAL BIGINT NOT NULL,
TIMES_TRIGGERED BIGINT NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ON DELETE CASCADE
);
CREATE TRIGGER DELETE_SIMPLE_TRIGGER DELETE ON QRTZ_TRIGGERS
BEGIN
DELETE FROM QRTZ_SIMPLE_TRIGGERS WHERE SCHED_NAME=OLD.SCHED_NAME AND TRIGGER_NAME=OLD.TRIGGER_NAME AND TRIGGER_GROUP=OLD.TRIGGER_GROUP;
END
;
CREATE TABLE QRTZ_SIMPROP_TRIGGERS
(
SCHED_NAME NVARCHAR (120) NOT NULL ,
TRIGGER_NAME NVARCHAR (150) NOT NULL ,
TRIGGER_GROUP NVARCHAR (150) NOT NULL ,
STR_PROP_1 NVARCHAR (512) NULL,
STR_PROP_2 NVARCHAR (512) NULL,
STR_PROP_3 NVARCHAR (512) NULL,
INT_PROP_1 INT NULL,
INT_PROP_2 INT NULL,
LONG_PROP_1 BIGINT NULL,
LONG_PROP_2 BIGINT NULL,
DEC_PROP_1 NUMERIC NULL,
DEC_PROP_2 NUMERIC NULL,
BOOL_PROP_1 BIT NULL,
BOOL_PROP_2 BIT NULL,
TIME_ZONE_ID NVARCHAR(80) NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ON DELETE CASCADE
);
CREATE TRIGGER DELETE_SIMPROP_TRIGGER DELETE ON QRTZ_TRIGGERS
BEGIN
DELETE FROM QRTZ_SIMPROP_TRIGGERS WHERE SCHED_NAME=OLD.SCHED_NAME AND TRIGGER_NAME=OLD.TRIGGER_NAME AND TRIGGER_GROUP=OLD.TRIGGER_GROUP;
END
;
CREATE TABLE QRTZ_CRON_TRIGGERS
(
SCHED_NAME NVARCHAR(120) NOT NULL,
TRIGGER_NAME NVARCHAR(150) NOT NULL,
TRIGGER_GROUP NVARCHAR(150) NOT NULL,
CRON_EXPRESSION NVARCHAR(250) NOT NULL,
TIME_ZONE_ID NVARCHAR(80),
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ON DELETE CASCADE
);
CREATE TRIGGER DELETE_CRON_TRIGGER DELETE ON QRTZ_TRIGGERS
BEGIN
DELETE FROM QRTZ_CRON_TRIGGERS WHERE SCHED_NAME=OLD.SCHED_NAME AND TRIGGER_NAME=OLD.TRIGGER_NAME AND TRIGGER_GROUP=OLD.TRIGGER_GROUP;
END
;
CREATE TABLE QRTZ_BLOB_TRIGGERS
(
SCHED_NAME NVARCHAR(120) NOT NULL,
TRIGGER_NAME NVARCHAR(150) NOT NULL,
TRIGGER_GROUP NVARCHAR(150) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ON DELETE CASCADE
);
CREATE TRIGGER DELETE_BLOB_TRIGGER DELETE ON QRTZ_TRIGGERS
BEGIN
DELETE FROM QRTZ_BLOB_TRIGGERS WHERE SCHED_NAME=OLD.SCHED_NAME AND TRIGGER_NAME=OLD.TRIGGER_NAME AND TRIGGER_GROUP=OLD.TRIGGER_GROUP;
END
;
CREATE TABLE QRTZ_CALENDARS
(
SCHED_NAME NVARCHAR(120) NOT NULL,
CALENDAR_NAME NVARCHAR(200) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
);
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
(
SCHED_NAME NVARCHAR(120) NOT NULL,
TRIGGER_GROUP NVARCHAR(150) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
);
CREATE TABLE QRTZ_FIRED_TRIGGERS
(
SCHED_NAME NVARCHAR(120) NOT NULL,
ENTRY_ID NVARCHAR(140) NOT NULL,
TRIGGER_NAME NVARCHAR(150) NOT NULL,
TRIGGER_GROUP NVARCHAR(150) NOT NULL,
INSTANCE_NAME NVARCHAR(200) NOT NULL,
FIRED_TIME BIGINT NOT NULL,
SCHED_TIME BIGINT NOT NULL,
PRIORITY INTEGER NOT NULL,
STATE NVARCHAR(16) NOT NULL,
JOB_NAME NVARCHAR(150) NULL,
JOB_GROUP NVARCHAR(150) NULL,
IS_NONCONCURRENT BIT NULL,
REQUESTS_RECOVERY BIT NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID)
);
CREATE TABLE QRTZ_SCHEDULER_STATE
(
SCHED_NAME NVARCHAR(120) NOT NULL,
INSTANCE_NAME NVARCHAR(200) NOT NULL,
LAST_CHECKIN_TIME BIGINT NOT NULL,
CHECKIN_INTERVAL BIGINT NOT NULL,
PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
);
CREATE TABLE QRTZ_LOCKS
(
SCHED_NAME NVARCHAR(120) NOT NULL,
LOCK_NAME NVARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME,LOCK_NAME)
);