获取正在Windows服务上运行的计划程序的实例

本文关键字:计划 程序 实例 运行 Windows 服务 获取 | 更新日期: 2023-09-27 18:27:19

假设我已经将Quartz.NET准备为Windows服务,并且它当前正在运行(ADOJobStoreSqlite上运行)。我需要控制我的Windows应用程序上的此服务,以便停止、启动、添加和删除作业等。如何获取此计划程序的实例?

很抱歉,如果这听起来像是一个简单的问题,但Quartz.NET上的文档似乎远远不够。只有少数人知道这件事,他们已经有了自己的生活。

更新:我的服务的quartz.config文件

# You can configure your scheduler in either <quartz> configuration section
# or in quartz properties file
# Configuration section has precedence
quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
quartz.threadPool.threadCount = 10
quartz.threadPool.threadPriority = Normal
# job initialization plugin handles our xml reading, without it defaults are used
quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz
quartz.plugin.xml.fileNames = ~/quartz_jobs.xml
quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz
quartz.scheduler.exporter.port = 555
quartz.scheduler.exporter.bindName = QuartzScheduler
quartz.scheduler.exporter.channelType = tcp
quartz.scheduler.exporter.channelName = httpQuartz

我在程序中使用的代码来获取调度程序:

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"] = "10";
properties["quartz.threadPool.threadPriority"] = "Normal";
// set remoting expoter
properties["quartz.scheduler.proxy"] = "true";
properties["quartz.scheduler.proxy.address"] = "tcp://127.0.0.1:555/QuartzScheduler";
ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler sched = sf.GetScheduler();

我的服务已安装并处于"已启动"状态,它以"本地系统帐户"的身份登录,并且可以与桌面交互。

获取正在Windows服务上运行的计划程序的实例

您的服务可以通过修改配置文件来公开调度器:

<add key="quartz.scheduler.exporter.type" value="Quartz.Simpl.RemotingSchedulerExporter, Quartz" />
<add key="quartz.scheduler.exporter.port" value="555" />
<add key="quartz.scheduler.exporter.bindName" value="QuartzScheduler" />
<add key="quartz.scheduler.exporter.channelType" value="tcp" />
<add key="quartz.scheduler.exporter.channelName" value="httpQuartz" />

然后,您的Windows应用程序可以使用适当的设置进行访问:

        //you can put these in a config file too.
        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://127.0.0.1:555/QuartzScheduler";
        ISchedulerFactory sf = new StdSchedulerFactory(properties);
        IScheduler sched = sf.GetScheduler();

quartz.net master包含文档中找不到的非常好的示例。

启动和停止Windows服务与Quartz无关。似乎有一个.NET API,但我不熟悉它

至于添加和删除作业。您将无法获得Windows服务的调度程序的实例。有两种方法可以解决这个问题。

  1. 定义WCF协定并在Windows服务中承载WCF服务。这很简单。您不需要IIS也不需要HTTP。在这种情况下,我建议使用TCP绑定
  2. 由于您已经在使用ADO作业存储,您可以将Windows应用程序和Windows服务设置为Quartz集群:

添加

<add key="quartz.jobStore.clustered" value="true"/>

应用程序和web配置。如果我没有记错,就不需要额外的代码。此外,您可以通过设置零大小线程池来阻止Windows应用程序窗体执行作业:

<add key="quartz.threadPool.type" value="Quartz.Simpl.ZeroSizeThreadPool, Quartz"/>

现在,您可以在Windows应用程序中实例化一个调度程序,并使用它来添加和删除作业。这些作业将存储在ADO作业存储中,并由Windows服务提取。显然,应用程序和服务必须配置相同的ADO作业集,并且Windows应用程序必须能够访问sqlite数据库。

还有一件事。使用第二种方法,您将无法从Windows应用程序中断正在运行的作业。