我创建了一个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();
}
答案 0 :(得分:0)
它可能与IIS或它与处理应用程序池回收的方式有关
这过去对我有用。
转到IIS管理器->应用程序池->创建一个新池,随意命名它
选择调度程序池->高级设置
在“常规”部分的“启动模式”下,选择“ AlwaysRunning”或“ true”(取决于IIS的版本)
在“流程模型”部分->“空闲超时(分钟)”设置为0(表示:没有Idel超时)
在“回收”部分->“常规时间间隔”设置为0(表示:不回收)
将Quartz站点部署到该应用程序池中。
向池发送一个请求以“唤醒您的应用”,该请求将一直运行到您停止它为止。
您还可以在托管服务器上安装一些工具,例如Keep Alive server for IIS 6.0 and 7.5,它可以在应用程序池回收后使应用程序保持活动状态,并且无需更改或设置太多配置。