Quartz.NET 未加载 SQL Server 数据库中定义的任何作业

问题描述 投票:0回答:1

我在 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';
c# sql-server quartz.net
1个回答
0
投票

为了回答我自己的问题,以便其他像我一样困惑的人,只需执行以下操作即可在数据库中的正确表中创建作业。 感谢@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 * * * * ?"));

    });
});

© www.soinside.com 2019 - 2024. All rights reserved.