首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >棘手的Quartz.NET场景

棘手的Quartz.NET场景
EN

Stack Overflow用户
提问于 2012-05-30 21:33:16
回答 1查看 7.3K关注 0票数 9

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

基本上,所需的体系结构是这种结构的一些变体:

Web <-> Quartz.NET <->数据库<-> Quartz.NET <-> Windows

到目前为止,我所做的是:

  • 是一个windows服务,它(目前)调度和运行乔布斯。从长远来看,情况显然不会是这样,但我想知道我是否可以保留它,并修改它,使它基本上表示上面图表中的"Quartz.NET's“。
  • ,web应用程序(我想这里的细节不是很重要)
  • (实际上是另一个窗口服务)

还有几个重要的注意事项:

  • 它必须从windows服务运行,并且它必须通过web应用程序(为了减少IIS上的负载)
  • 来调度,假设上面的项目仍然适用,上面的体系结构可以重新排列一些。

现在,有几个问题:

即使是possible?

  • Assuming (1)通过
  1. ,你们认为什么是最好的架构呢?
  2. 可以给我提供几个Quartz方法,这些方法可以帮助我查询数据库中的作业,以便在作业已被调度后执行?

这个问题只要符合条件,马上就会有赏金。如果问题在那之前得到满意的回答,我仍然会把赏金颁给答案的海报。所以,无论如何,如果你在这里给出一个很好的答案,你就会得到赏金。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-31 21:10:54

我试着按你的顺序回答你的问题。

  1. 是的,这是可能的。这实际上是使用Quartz.Net的一种常见方式。实际上,您还可以编写一个管理schedulers.
  2. Architecture.的ASP.Net MVC应用程序。理想情况下,在较高级别上,您的MVC应用程序将使用Quartz.Net API与安装为windows服务的Quartz.Net服务器进行对话。Quartz.Net使用remoting进行远程通信,因此使用remoting应用的任何限制(比如Silverlight中不支持远程处理等)。Quartz.Net提供了一种将其安装为开箱即用的windows服务的方法,因此这里除了配置服务本身使用AdoJobStore (在您的例子中)并启用远程处理之外,实际上没有太多的工作要做。在如何正确安装服务方面需要注意,所以如果您还没有这样做,请看一看at this post

在内部,在MVC应用程序中,您需要获得对调度程序的引用,并将其存储为单例。然后,在您的代码中,您将调度作业,并通过这个唯一的实例获取有关调度程序的信息。你可以用这样的东西:

代码语言:javascript
复制
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客户端。然后,要访问远程调度程序,只需调用

代码语言:javascript
复制
GetScheduler()

  1. 在这里查询一些示例代码,以便从调度程序获得所有作业:

DataTable GetJobs() { DataTable table =新的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(“TriggerType”);table.Columns.Add(“en19#”);table.Columns.Add("PreviousFireTime");var jobGroups = GetScheduler().GetJobGroupNames();foreach (string group in jobGroups) { var groupMatcher =GroupMatcher.GroupContains(组);var jobKeys = GetScheduler().GetJobKeys(groupMatcher);foreach (触发器中的ITrigger触发器){ DataRow行= table.NewRow();行“GroupName”=组;行“JobName”= jobKey.Name;行“JobDescription”= detail.Description;行“TriggerName”= trigger.Key.Name;行“TriggerGroupName”= trigger.Key.Group;行“TriggerType”= trigger.GetType().Name;行“TriggerState”= GetScheduler().GetTriggerState(trigger.Key);DateTimeOffset?nextFireTime = trigger.GetNextFireTimeUtc();if (nextFireTime.HasValue) { row"NextFireTime“=trigger.GetNextFireTimeUtc} DateTimeOffset?previousFireTime = trigger.GetPreviousFireTimeUtc();if (previousFireTime.HasValue) { row"PreviousFireTime“=PreviousFireTime}table.Rows.Add(行);}}返回表;}

您可以在Github上查看此代码

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10824581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档