我将尝试按照您提出问题的顺序回答您的问题。
是的,有可能做到这一点。这实际上是使用 Quartz.Net 的一种常见方式。事实上,您也可以编写一个管理 Quartz.Net 调度程序的 ASP.Net MVC 应用程序。
建筑学。理想情况下,在高层次上,您的 MVC 应用程序将使用 Quartz.Net API 与作为 Windows 服务安装在某处的 Quartz.Net 服务器通信。Quartz.Net 使用远程处理进行远程通信,因此使用远程处理的任何限制都适用(例如 Silverlight 不支持它等)。Quartz.Net 提供了一种将其安装为开箱即用的 Windows 服务的方法,因此除了将服务本身配置为使用(在您的情况下)AdoJobStore 以及启用远程处理。关于如何正确安装该服务需要注意一些事项,所以如果您还没有这样做,请查看这篇文章。
在内部,在您的 MVC 应用程序中,您需要获取对调度程序的引用并将其存储为单例。然后在您的代码中,您将安排作业并通过此唯一实例获取有关调度程序的信息。你可以使用这样的东西:
public class QuartzScheduler
{
public QuartzScheduler(string server, int port, string scheduler)
{
Address = string.Format("tcp://{0}:{1}/{2}", server, port, scheduler);
_schedulerFactory = new StdSchedulerFactory(getProperties(Address));
try
{
_scheduler = _schedulerFactory.GetScheduler();
}
catch (SchedulerException)
{
MessageBox.Show("Unable to connect to the specified server", "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
public string Address { get; private set; }
private NameValueCollection getProperties(string address)
{
NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "RemoteClient";
properties["quartz.scheduler.proxy"] = "true";
properties["quartz.threadPool.threadCount"] = "0";
properties["quartz.scheduler.proxy.address"] = address;
return properties;
}
public IScheduler GetScheduler()
{
return _scheduler;
}
}
此代码设置您的 Quart.Net 客户端。然后访问远程调度程序,只需调用
GetScheduler()
查询 下面是一些从调度程序获取所有作业的示例代码:
public DataTable GetJobs()
{
DataTable table = new DataTable();
table.Columns.Add("GroupName");
table.Columns.Add("JobName");
table.Columns.Add("JobDescription");
table.Columns.Add("TriggerName");
table.Columns.Add("TriggerGroupName");
table.Columns.Add("TriggerType");
table.Columns.Add("TriggerState");
table.Columns.Add("NextFireTime");
table.Columns.Add("PreviousFireTime");
var jobGroups = GetScheduler().GetJobGroupNames();
foreach (string group in jobGroups)
{
var groupMatcher = GroupMatcher<JobKey>.GroupContains(group);
var jobKeys = GetScheduler().GetJobKeys(groupMatcher);
foreach (var jobKey in jobKeys)
{
var detail = GetScheduler().GetJobDetail(jobKey);
var triggers = GetScheduler().GetTriggersOfJob(jobKey);
foreach (ITrigger trigger in triggers)
{
DataRow row = table.NewRow();
row["GroupName"] = group;
row["JobName"] = jobKey.Name;
row["JobDescription"] = detail.Description;
row["TriggerName"] = trigger.Key.Name;
row["TriggerGroupName"] = trigger.Key.Group;
row["TriggerType"] = trigger.GetType().Name;
row["TriggerState"] = GetScheduler().GetTriggerState(trigger.Key);
DateTimeOffset? nextFireTime = trigger.GetNextFireTimeUtc();
if (nextFireTime.HasValue)
{
row["NextFireTime"] = TimeZone.CurrentTimeZone.ToLocalTime(nextFireTime.Value.DateTime);
}
DateTimeOffset? previousFireTime = trigger.GetPreviousFireTimeUtc();
if (previousFireTime.HasValue)
{
row["PreviousFireTime"] = TimeZone.CurrentTimeZone.ToLocalTime(previousFireTime.Value.DateTime);
}
table.Rows.Add(row);
}
}
}
return table;
}
您可以在Github上查看此代码