gpt4 book ai didi

c# - 棘手的 Quartz.NET 场景

转载 作者:太空狗 更新时间:2023-10-29 18:03:30 25 4
gpt4 key购买 nike

好的,这里有一些背景知识。我有一个大型 Web 应用程序 (MVC3),它执行各种不重要的事情。我需要此 Web 应用程序能够在 Oracle 数据库 中安排临时 Quartz.NET 作业。然后,我希望稍后通过 windows 服务 执行作业。理想情况下,我希望安排它们以均匀的间隔运行,但可以选择通过网络应用程序添加作业。

基本上,所需的架构是以下的一些变体:

Web 应用程序 <--> Quartz.NET <--> 数据库 <--> Quartz.NET <--> Windows 服务

到目前为止我编写的代码:

  • 一个 Windows 服务,它(目前)安排和运行作业。从长远来看,这显然不会是这种情况,但我想知道我是否可以只保留它并对其进行修改,使其基本上代表上图中的两个“Quartz.NET”。
  • 网络应用(我想细节在这里不是很重要)
  • 作业(实际上只是另一个 Windows 服务)

还有一些重要的注意事项:

  • 它必须从 Windows 服务运行,并且必须通过 Web 应用程序进行调度(以减少 IIS 上的负载)
  • 可以稍微重新安排上面的架构,假设上面的项目符号仍然适用。

现在,有几个问题:

  1. 这可能吗?
  2. 假设 (1) 通过,你们认为最好的架构是什么?请参阅我编写的第一个项目符号。
  3. 有人可以给我一些 Quartz 方法,这些方法可以帮助我查询数据库以在作业已经安排好后执行吗?

一旦符合条件,就会有关于这个问题的赏金。如果在此之前以令人满意的方式回答了问题,我仍然会将赏金奖励给答案的发布者。因此,无论如何,如果您在这里给出一个好的答案,您将获得赏金。

最佳答案

我会尝试按照您的问题顺序回答您的问题。

  1. 是的,可以这样做。这实际上是使用 Quartz.Net 的一种常见方式。事实上,您还可以编写管理 Quartz.Net 调度器的 ASP.Net MVC 应用程序。

  2. 建筑学。理想情况下,在较高级别,您的 MVC 应用程序将使用 Quartz.Net API 与作为 Windows 服务安装在某处的 Quartz.Net 服务器通信。 Quartz.Net 使用远程处理进行远程通信,因此使用远程处理的任何限制都适用(比如它在 Silverlight 等中不受支持)。 Quartz.Net 提供了一种将其安装为开箱即用的 Windows 服务的方法,因此除了配置服务本身以使用(在您的情况下)AdoJobStore 之外,这里实际上没有太多工作要做,并且还启用远程处理。关于如何正确安装该服务需要注意一些事项,所以如果您还没有这样做,请查看 at this post .

在您的 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()
  1. 查询下面是一些示例代码,用于从调度程序中获取所有作业:

    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 上查看此代码

关于c# - 棘手的 Quartz.NET 场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10824581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com