Quartz .net任务未执行

3
我已创建了一个ASP.NET MVC网站。然后我创建了一个名为Site.Scheduler的类库,其中我想放置所有触发器和作业。
我创建了一个简单的测试作业。
public class CurrencyRatesJob : IJob
{
    private readonly IBudgetsRepository budgetsRepository;

    public CurrencyRatesJob(IBudgetsRepository budgetsRepository)
    {
        this.budgetsRepository = budgetsRepository;
    }

    public void Execute(IJobExecutionContext context)
    {
        try
        {
            var budgets = new BudgetsDTO();
            var user = new UserDTO();

            budgets.Sum = 1;
            budgets.Name = "Quartz";
            user.Email = "email@g.com";

            budgetsRepository.InsertBudget(budgets, user);
        }
        catch (Exception ex)
        {
            throw new Quartz.JobExecutionException(ex);
        }
    }
}

以及工作调度器

public class CurrencyRatesJobScheduler
{
    public static void GetCurrencyRates()
    {
        try
        {
            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

            IJobDetail job = JobBuilder.Create<CurrencyRatesJob>().Build();

            ITrigger trigger = TriggerBuilder.Create()
                .StartNow()
                .WithSimpleSchedule
                    (s =>
                        s.WithIntervalInSeconds(10)
                        .RepeatForever()
                    )
                .Build();

            scheduler.ScheduleJob(job, trigger);
        }
        catch (Exception ex)
        {
            ex.ToString();
        }
    }
}

为了在应用程序启动时启动计划任务,我在Global.asax.cs文件中添加了以下内容。
CurrencyRatesJobScheduler.GetCurrencyRates();

经过所有这些,我预期工作每10秒执行一次,并将所有信息插入数据库,但它什么都不做,也没有任何错误。

有人知道可能出现什么问题吗?

编辑:

因此,我已经创建了所有必要的表(从Quartz.NET执行了脚本),并在我的类库中添加了一个新的App.config文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="quartz.scheduler.instanceName" value="MyQuartzScheduler" />
    <add key="quartz.scheduler.instanceId" value="instance_one" />
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
    <add key="quartz.threadPool.threadCount" value="10" />
    <add key="quartz.threadPool.threadPriority" value="1" />
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
    <add key="quartz.jobStore.misfireThreshold" value="60000" />
    <add key="quartz.jobStore.dataSource" value="default" />
    <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" />
    <add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />
    <add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
    <add key="quartz.dataSource.default.connectionString" value="Server=(local);Database=My.Database;UID=User;PWD=Password" />
    <add key="quartz.dataSource.default.provider" value="SqlServer-20" />
    <add key="quartz.jobStore.useProperties" value="true" />
  </appSettings>
</configuration>

仍然没有运气。除此之外,在数据库中也没有存储任何触发器或作业。


1
你期望 catch (Exception ex) { ex.ToString(); } 做什么? - Caramiriel
我在想可能是我安排任务时出错了。我在调试时使用它。 - Marian Ene
问题是,它捕获了错误,并将其转换为字符串,但它没有对这个字符串做任何处理。因此实际上会发生什么...... 它会在 try {} 语句中消除任何错误。 - Caramiriel
请查看编辑处的配置部分。 - Nick Patsaris
3个回答

6
您需要调用
  scheduler.Start();

1

首先要注意的是,您尚未启动scheduler,因此quartz未运行。

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();

启动后,服务器将扫描数据库以获取作业细节/触发器,并相应地进行处理。

但是,您还希望为作业细节/触发器添加适当的标识。这些对于quartz创建主键是必需的,否则您将收到一个SchedulerException

IJobDetail job = JobBuilder.Create<CurrencyRatesJob>()
                           .WithIdentity("currencyJob", "group1")
                           .Build();

ITrigger trigger = TriggerBuilder.Create()
                   .StartNow()
                   .WithIdentity("currencyJob", "group1")
                   .WithSimpleSchedule(s => s.WithIntervalInSeconds(10).RepeatForever())
                   .Build();

关于您的配置文件,您需要声明一个适当的quartz部分,并在其中添加设置(默认情况下,这是StdSchedulerFactory用于创建属性的位置)。
<configuration>
  <configSections>
    <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  </configSections>

  <quartz>
     <add key="quartz.scheduler.instanceName" value="MyQuartzScheduler" />
     <add key="quartz.scheduler.instanceId" value="AUTO" />
      ...
  </quartz>   
</configuration>

它仍然没有运行任务。我现在在想,我没有为石英钟进行任何配置,告诉他线程数量或作业存储类型。我在 Quartz .net 网站上读到过,“Quartz.NET 带有合理的默认值”。 - Marian Ene
有一些需要设置的配置设置。请参见此处获取更多信息。 - Nick Patsaris
尝试了配置的事情。仍然不起作用。现在我从那个配置中得到一些消息,说“找不到元素石英的模式信息”等等。我应该编辑job_scheduling_data_2_0.xsd以添加这些元素吗? - Marian Ene
如果您使用RAMJobStore,是的,您需要在quartz.xml文件中存储作业信息。您还需要根据此处提到的更改配置文件。我以为您正在使用ADOJobStore(作业存储在数据库中),因为您在问题中提到了数据库。 - Nick Patsaris
我正在使用ADOJobStore,但仍然收到这些消息。尽管我没有收到任何错误,但我仍然不明白为什么它不起作用。触发器和作业详细信息都没有保存在QRTZ_xxx表中。 - Marian Ene
@MarianEne 这很奇怪。我使用的代码基本相同,在我的机器上可以运行。 - Nick Patsaris

1

我也遇到了同样的问题。我通过将配置信息放置在使用应用程序的 app.config 中来解决了这个问题。由于类库不能独立运行,它应该被另一个应用程序引用,可能是控制台或网站。我们需要将所有配置项放置在使用应用程序中,这可能会有所帮助。干杯。愉快地分享。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接