我不知道如何在 ASP.NET 中使用 Quartz.dll。在哪里编写调度作业以每天早上触发邮件的代码?请如果有人知道它请帮助我...
编辑:我发现如何以 PRO 方式使用 Quartz.NET?真正有用。
我不知道如何在 ASP.NET 中使用 Quartz.dll。在哪里编写调度作业以每天早上触发邮件的代码?请如果有人知道它请帮助我...
编辑:我发现如何以 PRO 方式使用 Quartz.NET?真正有用。
您有几个选项,具体取决于您想要做什么以及如何设置它。例如,您可以将 Quartz.Net 服务器安装为独立的 Windows 服务,也可以将其嵌入到您的 asp.net 应用程序中。
如果你想嵌入运行它,那么你可以从你的 global.asax 启动服务器,就像这样(来自源代码示例,示例 #12):
NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "RemoteServer";
// set thread pool info
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "5";
properties["quartz.threadPool.threadPriority"] = "Normal";
ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler sched = sf.GetScheduler();
sched.Start();
如果您将它作为服务运行,您将像这样远程连接到它(来自示例 #12):
NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "RemoteClient";
// set thread pool info
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "5";
properties["quartz.threadPool.threadPriority"] = "Normal";
// set remoting expoter
properties["quartz.scheduler.proxy"] = "true";
properties["quartz.scheduler.proxy.address"] = "tcp://localhost:555/QuartzScheduler";
// First we must get a reference to a scheduler
ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler sched = sf.GetScheduler();
一旦你引用了调度程序(无论是通过远程处理还是因为你有一个嵌入式实例),你就可以像这样安排作业:
// define the job and ask it to run
JobDetail job = new JobDetail("remotelyAddedJob", "default", typeof(SimpleJob));
JobDataMap map = new JobDataMap();
map.Put("msg", "Your remotely added job has executed!");
job.JobDataMap = map;
CronTrigger trigger = new CronTrigger("remotelyAddedTrigger", "default", "remotelyAddedJob", "default", DateTime.UtcNow, null, "/5 * * ? * *");
// schedule the job
sched.ScheduleJob(job, trigger);
这是我为开始使用 Quartz.Net 的人们写的一些帖子的链接:http: //jvilalta.blogspot.com/2009/03/getting-started-with-quartznet-part-1.html
几周前,我写了一篇关于使用 Quartz.Net 在 Windows Azure Worker Roles 中安排作业的文章。从那时起,我遇到了一个要求,促使我围绕 Quartz.Net IScheduler 创建一个包装器。JobSchedule 负责从 CloudConfigurationManager 读取调度字符串并调度作业。
CloudConfigurationManager 从角色的配置文件中读取设置,可以通过云服务配置部分下的 Windows Azure 管理门户进行编辑。
以下示例将安排需要在每天早上 6 点、上午 8 点、上午 10 点、下午 12:30 和下午 4:30 执行的作业。计划在角色设置中定义,可以通过 Visual Studio 进行编辑。要访问角色设置,请转到您的 Windows Azure 云服务项目并在角色文件夹下找到所需的角色配置。通过双击配置文件打开配置编辑器,然后导航到“设置”选项卡。单击“添加设置”并将新设置命名为“JobDailySchedule”并将其值设置为 6:0;8:0;10:0;12:30;16:30;
The code from this Post is part of the Brisebois.WindowsAzure NuGet Package
To install Brisebois.WindowsAzure, run the following command in the Package Manager Console
PM> Install-Package Brisebois.WindowsAzure
Get more details about the Nuget Package.
然后使用 JobSchedule 使用角色配置文件中定义的计划安排每日作业。
var schedule = new JobSchedule();
schedule.ScheduleDailyJob("JobDailySchedule",
typeof(DailyJob));
DailyJob 实现如下。由于这是一个演示,我不会在作业中添加任何特定的逻辑。
public class DailyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
//Do your daily work here
}
}
JobSchedule 包装了 Quartz.Net IScheduler。在之前的一篇文章中,我谈到了包装你的 3rd 方工具的重要性,这是一个很好的例子,因为我包含作业调度逻辑,我可以在不影响使用 JobSchedule 的代码的情况下更改此逻辑。
JobSchedule 应该在 Role 启动时配置,并且 JobSchedule 实例应该在 Role 的整个生命周期中保持。可以通过在云服务的配置部分下的 Windows Azure 管理门户更改“JobDailySchedule”设置来更改计划。然后要应用新计划,请通过云服务实例部分下的 Windows Azure 管理门户重新启动角色实例。
public class JobSchedule
{
private readonly IScheduler sched;
public JobSchedule()
{
var schedFact = new StdSchedulerFactory();
sched = schedFact.GetScheduler();
sched.Start();
}
/// <summary>
/// Will schedule jobs in Eastern Standard Time
/// </summary>
/// <param name="scheduleConfig">Setting Key from your CloudConfigurations,
/// value format "hh:mm;hh:mm;"</param>
/// <param name="jobType">must inherit from IJob</param>
public void ScheduleDailyJob(string scheduleConfig,
Type jobType)
{
ScheduleDailyJob(scheduleConfig,
jobType,
"Eastern Standard Time");
}
/// <param name="scheduleConfig">Setting Key from your CloudConfigurations,
/// value format "hh:mm;hh:mm;"</param>
/// <param name="jobType">must inherit from IJob</param>
public void ScheduleDailyJob(string scheduleConfig,
Type jobType,
string timeZoneId)
{
var schedule = CloudConfigurationManager.GetSetting(scheduleConfig);
if (schedule == "-")
return;
schedule.Split(';')
.Where(s => !string.IsNullOrWhiteSpace(s))
.ToList()
.ForEach(h =>
{
var index = h.IndexOf(':');
var hour = h.Substring(0, index);
var minutes = h.Substring(index + 1, h.Length - (index + 1));
var job = new JobDetailImpl(jobType.Name + hour + minutes, null,
jobType);
var dh = Convert.ToInt32(hour, CultureInfo.InvariantCulture);
var dhm = Convert.ToInt32(minutes, CultureInfo.InvariantCulture);
var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
var cronScheduleBuilder = CronScheduleBuilder
.DailyAtHourAndMinute(dh, dhm)
.InTimeZone(tz);
var trigger = TriggerBuilder.Create()
.StartNow()
.WithSchedule(cronScheduleBuilder)
.Build();
sched.ScheduleJob(job, trigger);
});
}
/// <summary>
/// Will schedule jobs in Eastern Standard Time
/// </summary>
/// <param name="scheduleConfig">Setting Key from your CloudConfigurations,
/// value format "hh:mm;hh:mm;"</param>
/// <param name="jobType">must inherit from IJob</param>
public void ScheduleWeeklyJob(string scheduleConfig,
Type jobType)
{
ScheduleWeeklyJob(scheduleConfig,
jobType,
"Eastern Standard Time");
}
/// <param name="scheduleConfig">Setting Key from your CloudConfigurations,
/// value format "hh:mm;hh:mm;"</param>
/// <param name="jobType">must inherit from IJob</param>
public void ScheduleWeeklyJob(string scheduleConfig,
Type jobType,
string timeZoneId)
{
var schedule = CloudConfigurationManager.GetSetting(scheduleConfig);
schedule.Split(';')
.Where(s => !string.IsNullOrWhiteSpace(s))
.ToList()
.ForEach(h =>
{
var index = h.IndexOf(':');
var hour = h.Substring(0, index);
var minutes = h.Substring(index + 1, h.Length - (index + 1));
var job = new JobDetailImpl(jobType.Name + hour + minutes, null,
jobType);
var dh = Convert.ToInt32(hour, CultureInfo.InvariantCulture);
var dhm = Convert.ToInt32(minutes, CultureInfo.InvariantCulture);
var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
var builder = CronScheduleBuilder
.WeeklyOnDayAndHourAndMinute(DayOfWeek.Monday,
dh,
dhm)
.InTimeZone(tz);
var trigger = TriggerBuilder.Create()
.StartNow()
.WithSchedule(builder)
.Build();
sched.ScheduleJob(job, trigger);
});
}
}