我在 SQL Server 数据库中定义了作业和触发器,但无法加载作业或触发触发器。我只是想知道是否有人可以指导我解决这个问题,我确信我一定做错了什么,但只是无法发现它。
我已经阅读了Quartz.NET文档,但可能误解了一些设置。
非常感谢任何和所有帮助。
您可以在下面看到启动的一些输出,并且您可以看到有关“添加 0 个作业,0 个触发器”的消息
Using job store 'Quartz.Impl.AdoJobStore.JobStoreTX', supports persistence: True, clustered: True
{"@t":"2024-07-08T14:10:24.3246282Z","@mt":"Using job store 'Quartz.Impl.AdoJobStore.JobStoreTX', supports persistence: True, clustered: True","SourceContext":"Quartz.Impl.StdSchedulerFactory","SFTPService":"SFTPService"}
{"@t":"2024-07-08T14:10:24.3328792Z","@mt":"Adding 0 jobs, 0 triggers.","SourceContext":"Quartz.ContainerConfigurationProcessor","SFTPService":"SFTPService"}
下面是我实现的用于初始化 Quartz 的启动代码,它在 C# 控制台应用程序中运行。
我在启动时拥有所有配置,并且没有使用
appsettings.json
文件中的任何设置。
//-------------------------------------------------------------------------
// Setup Quartz the timer scheduling library
//-------------------------------------------------------------------------
services.AddQuartzHostedService(opt =>
{
opt.WaitForJobsToComplete = true;
});
services.AddQuartz(q=>
{
q.UsePersistentStore(s =>
{
s.UseProperties = true;
s.UseNewtonsoftJsonSerializer();
s.UseSqlServer(sqlServer =>
{
sqlServer.ConnectionString = configuration.GetConnectionString("Quartz") ?? throw new ArgumentNullException("Quartz connection string");
sqlServer.TablePrefix = "QRTZ_";
});
s.UseClustering(c =>
{
c.CheckinInterval = TimeSpan.FromSeconds(10);
c.CheckinMisfireThreshold = TimeSpan.FromSeconds(20);
});
});
});
我使用这些脚本在数据库中创建了一些作业:
INSERT INTO QRTZ_JOB_DETAILS
(SCHED_NAME, JOB_NAME, JOB_GROUP, JOB_CLASS_NAME, IS_DURABLE, IS_NONCONCURRENT, IS_UPDATE_DATA, REQUESTS_RECOVERY, JOB_DATA)
VALUES
('SFTPService', 'SFTPDownloadJobName', 'SFTPJobGroup', 'MyCompany.SFTP.WorkerLibrary.SFTPDownloadJob, MyCompany.SFTP.WorkerLibrary', 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
('SFTPService', 'FrequentTriggerName', 'FrequentTriggerGroup', 'SFTPDownloadJobName', 'SFTPJobGroup', 'Fires every 20 seconds', NULL, NULL, 5, 'WAITING', 'CRON', DATEDIFF(SECOND, '1970-01-01', GETDATE()), NULL, NULL, 0, NULL);
INSERT INTO QRTZ_CRON_TRIGGERS
(SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, CRON_EXPRESSION, TIME_ZONE_ID)
VALUES
('SFTPService', 'FrequentTriggerName', 'FrequentTriggerGroup', '0/20 * * * * ?', NULL);
DECLARE @jsonData NVARCHAR(MAX) = '{
"SftpHostName": "eu-central-1.sftpcloud.io",
"SftpPortNumber": "22",
"SftpUserName": "*********************",
"SftpPassword": "***********************",
"SftpRemoteDirectory": "/",
"SftpLocalDirectory": "",
"SftpFileNameOrPattern": "test.txt"
}';
DECLARE @jobData VARBINARY(MAX) = CONVERT(VARBINARY(MAX), @jsonData);
UPDATE QRTZ_TRIGGERS
SET JOB_DATA = @jobData
WHERE SCHED_NAME = 'SFTPService'
AND TRIGGER_NAME = 'FrequentTriggerName'
AND TRIGGER_GROUP = 'FrequentTriggerGroup';
为了回答我自己的问题,以便其他像我一样困惑的人,只需执行以下操作即可在数据库中的正确表中创建作业。 感谢@Phil Ross 的指点。
因此,在启动时创建作业和触发器的完整代码如下。接下来的问题是,当需要定义其他作业或触发器时,如何使此功能可供客户配置,因此我需要研究该部分。
services.AddQuartz(q=>
{
q.UsePersistentStore(s =>
{
s.UseProperties = true;
s.UseNewtonsoftJsonSerializer();
s.UseSqlServer(sqlServer =>
{
sqlServer.ConnectionString = configuration.GetConnectionString("Quartz") ?? throw new ArgumentNullException("Quartz connection string");
sqlServer.TablePrefix = "QRTZ_";
});
s.UseClustering(c =>
{
c.CheckinInterval = TimeSpan.FromSeconds(10);
c.CheckinMisfireThreshold = TimeSpan.FromSeconds(20);
});
q.AddJob<SFTPDownloadJob>(j => j
.StoreDurably()
.WithIdentity("SFTPDownloadJob")
.WithDescription("This job downloads files from an SFTP server"));
q.AddTrigger(t => t
.WithIdentity("SFTPDownloadJobTrigger")
.ForJob("SFTPDownloadJob")
.WithCronSchedule("0/20 * * * * ?"));
});
});