Quartz Scheduler不在远程服务器上更新

时间:2018-08-30 12:20:04

标签: quartz-scheduler

我创建了一个MVC应用程序,其中实施了Quartz调度程序以在早晨的特定时间提取汇率。它可以在Dev上运行,但是当我上传到远程服务器时,它不能正常工作。

问题出在远程服务器上,Quartz Scheduler根本没有触发,因此无法获取汇率。

是否需要将某些内容复制到远程服务器 有我需要设置的设置吗?

这就是我实施汇率拉动的方式。

public class JobScheduler
{
    public static async Task Start()
    {
        ISchedulerFactory factory = new StdSchedulerFactory();
        IScheduler scheduler = await factory.GetScheduler();

        IJobDetail job = JobBuilder.Create<HelloJob>()
            .WithIdentity("name", "group")
            .UsingJobData("Name", "Bob")
            .Build();

        ITrigger trigger = TriggerBuilder.Create()
            .WithDailyTimeIntervalSchedule
            (s => 
            s.WithIntervalInHours(24)
            .OnEveryDay()
            .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(14,08))
            )
            .Build();
        await scheduler.ScheduleJob(job, trigger);
        await scheduler.Start();
        //Thread.Sleep(TimeSpan.FromMinutes(10));
        //await scheduler.Shutdown();
    }
}


public class HelloJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        DateTime now = DateTime.Now;
        var rate = GetRate();

        if (rate != 0)
        {
            System.Diagnostics.Debug.WriteLine($"Exchange Rate: {rate}");

            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Default"].ConnectionString))
            {
                if (connection.State == System.Data.ConnectionState.Closed)
                    await connection.OpenAsync();
                var cmd = new SqlCommand($"SELECT Value FROM AppConfigurations WHERE Name = '{AppConfigarationItems.FallBackExchangeRate}'", connection);

                object value = cmd.ExecuteScalar();

                if (value == null)
                {
                    var sql = $@"INSERT INTO AppConfigurations (Name,Value,DoubleValue,LastUpdateDate)
                             VALUES ('{AppConfigarationItems.FallBackExchangeRate}','{rate.ToString().Replace(',', '.')}',{rate.ToString().Replace(',', '.')},'{now}')";
                    cmd = new SqlCommand(sql, connection);

                    int result = cmd.ExecuteNonQuery();
                }
                else
                {
                    var sql = $@"UPDATE AppConfigurations 
                             SET Value = '{rate.ToString().Replace(',', '.')}',
                             DoubleValue = {rate.ToString().Replace(',', '.')},
                             LastUpdateDate = '{now}'
                             WHERE Name = '{AppConfigarationItems.FallBackExchangeRate}'";
                    cmd = new SqlCommand(sql, connection);

                    int result = cmd.ExecuteNonQuery();


                }
            }
        }
    }




    protected override void Application_Start(object sender, EventArgs e)
    {
        System.Globalization.CultureInfo.DefaultThreadCurrentCulture = new System.Globalization.CultureInfo("en-ZA");
        AbpBootstrapper.IocManager.IocContainer.AddFacility<LoggingFacility>(f => f.UseLog4Net().WithConfig("log4net.config"));
        base.Application_Start(sender, e);
        JobScheduler.Start().Wait();
    }

1 个答案:

答案 0 :(得分:0)

它可能与IIS或它与处理应用程序池回收的方式有关

这过去对我有用。

  1. 转到IIS管理器->应用程序池->创建一个新池,随意命名它

  2. 选择调度程序池->高级设置

  3. 在“常规”部分的“启动模式”下,选择“ AlwaysRunning”或“ true”(取决于IIS的版本)

  4. 在“流程模型”部分->“空闲超时(分钟)”设置为0(表示:没有Idel超时)

  5. 在“回收”部分->“常规时间间隔”设置为0(表示:不回收)

  6. 将Quartz站点部署到该应用程序池中。

  7. 向池发送一个请求以“唤醒您的应用”,该请求将一直运行到您停止它为止。

您还可以在托管服务器上安装一些工具,例如Keep Alive server for IIS 6.0 and 7.5,它可以在应用程序池回收后使应用程序保持活动状态,并且无需更改或设置太多配置。