.Net Core 2.0 的 ConsoleApp 搭建 Quartz(xml配置)windows服务
零、创建一个.Net Core 2.0 的ConsoleApp 应用,建完就是这个样子了。
添加Log4Net 的引用,(不想看可以不看,个人习惯)
Install-Package log4net
添加Config文件夹
往文件夹里面添加Log4net.xml(别忘记了设置Copy always)
添加Log4NetConfig.cs文件
往里面写几行代码
/// <summary>
/// log4net拓展
/// </summary>
public sealed class Log4netConfig
{
/// <summary>
/// 配置默认数据
/// </summary>
public static void DefalutConfig()
{
var defalutResposity = LogManager.GetRepository(Assembly.GetCallingAssembly());
var path = Path.Combine(Directory.GetCurrentDirectory(), "Config", "Log4net.xml");
XmlConfigurator.Configure(defalutResposity, new FileInfo(path));
}
}
Log4netConfig
在Main函数加下面几行代码
Environment.CurrentDirectory = AppContext.BaseDirectory;
Log4NetConfig.DefalutConfig();
var logger = LogManager.GetLogger(typeof(Program));
logger.Info("服务开始");
Main
得到的差不多就是这样了

运行下,可以看到日志基本就没错了。
一、windows服务的搭建
大概或许是看下了https://github.com/aspnet/Hosting/tree/dev/src/Microsoft.AspNetCore.Hosting,随便乱写的
1.引用
Install-Package System.ServiceProcess.ServiceController
Install-Package Install-Package System.Configuration.ConfigurationManager
2.添加appSettings.config
在Config文件夹下添加appSettings.config
添加内容
<appSettings>
<!--服务名称-->
<add key="ServiceName" value="MyTestService"/>
</appSettings>
3.添加HostService.cs
然后写上如下代码
/// <summary>
/// 服务
/// </summary>
public class HostService : ServiceBase
{
private ILog Log = LogManager.GetLogger(typeof(HostService)); /// <summary>
/// Creates an instance of <c>WebHostService</c> which hosts the specified web application.
/// </summary>
/// <param name="host">The configured web host containing the web application to host in the Windows service.</param>
public HostService()
{
} public void Start()
{
Log.Info($"{base.ServiceName}服务开启");
OnStart(null);
} protected sealed override void OnStart(string[] args)
{
OnStarting(args);
//dosomthing
OnStarted();
} protected sealed override void OnStop()
{
Log.Info($"{base.ServiceName}服务关闭");
OnStopping();
try
{
}
finally
{
OnStopped();
}
} /// <summary>
/// Executes before ASP.NET Core starts.
/// </summary>
/// <param name="args">The command line arguments passed to the service.</param>
protected virtual void OnStarting(string[] args) { } /// <summary>
/// Executes after ASP.NET Core starts.
/// </summary>
protected virtual void OnStarted() { } /// <summary>
/// Executes before ASP.NET Core shuts down.
/// </summary>
protected virtual void OnStopping() { } /// <summary>
/// Executes after ASP.NET Core shuts down.
/// </summary>
protected virtual void OnStopped() { }
}
HostService
4. Main 改为如下代码
var serviceName = ConfigurationManager.AppSettings["ServiceName"];
var hostService = new HostService { ServiceName = serviceName };
logger.Info("服务开始");
#if DEBUG
//服务名称赋值
Console.WriteLine($"{serviceName}服务开启...");
hostService.Start(); Console.ReadKey(true);
hostService.Stop();
Console.WriteLine($"{serviceName}服务停止");
#else
logger.Info($"{serviceName}服务开启...");
var servicesToRun = new ServiceBase[] { hostService };
ServiceBase.Run(servicesToRun);
#endif
Console.ReadLine();
Main
这个时候,运行,服务就可以启动了。
大概就是这么个效果

二、quart的使用
1.引用
添加引用
Install-Package Quartz
Install-Package Quartz.Plugins
2.添加TestQuartzService .cs 文件,写入以下代码
public class TestQuartzService : IDisposable
{
private ILog Log = LogManager.GetLogger(typeof(TestQuartzService));
public List<IScheduler> Schedulers = new List<IScheduler>();
public void Start()
{
Log.Info("quartz开启!");
// 从工厂中获取调度程序实例
StdSchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = factory.GetScheduler().Result;
Schedulers.Add(scheduler);
scheduler.Start();
Log.Info("quartz开启完成!");
} public void Stop()
{
Log.Info("quartz关闭!");
foreach (var scheduler in Schedulers)
{
scheduler.Shutdown().GetAwaiter().GetResult();
}
Log.Info("quartz关闭完成!");
} public void Dispose()
{
foreach (var scheduler in Schedulers)
{
if (scheduler.IsStarted)
{
scheduler.Shutdown().GetAwaiter().GetResult();
}
}
}
}
TestQuartzService
3.添加TestJob.cs文件
写入以下代码
public class TestJob : IJob
{
private ILog Log = LogManager.GetLogger(typeof(TestJob));
public Task Execute(IJobExecutionContext context)
{
Log.Info("测试job启动");
Console.WriteLine("测试job启动");
return Task.CompletedTask;
}
}
TestJob
4.添加 quartz.config
# You can configure your scheduler in either <quartz> configuration section
# or in quartz properties file
# Configuration section has precedence quartz.scheduler.instanceName = ServerScheduler # configure thread pool info
quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
quartz.threadPool.threadCount =
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.Plugins
quartz.plugin.xml.fileNames = ~/quartz_jobs.xml
quartz.config
5.添加quartz_jobs.xml
<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
<processing-directives>
<overwrite-existing-data>true</overwrite-existing-data>
</processing-directives>
<schedule>
<job>
<name>TestJob</name>
<group>TestJobGroup</group>
<description>测试Job</description>
<job-type>TestQuartzService.TestJob,TestQuartzService</job-type>
<durable>true</durable>
<recover>false</recover>
</job>
<trigger>
<cron>
<name>TestJobJobTrigger</name>
<group>TestJobTriggerGroup</group>
<job-name>TestJob</job-name>
<job-group>TestJobGroup</job-group>
<misfire-instruction>DoNothing</misfire-instruction>
<cron-expression>/ * * * * ?</cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>
quartz_job
6.HostService.cs改为
/// <summary>
/// 服务
/// </summary>
public class HostService : ServiceBase
{
private ILog Log = LogManager.GetLogger(typeof(HostService)); private TestQuartzService _testQuartzService;
/// <summary>
/// Creates an instance of <c>WebHostService</c> which hosts the specified web application.
/// </summary>
/// <param name="host">The configured web host containing the web application to host in the Windows service.</param>
public HostService()
{
_testQuartzService = new TestQuartzService();
} public void Start()
{
Log.Info($"{base.ServiceName}服务开启");
OnStart(null);
} protected sealed override void OnStart(string[] args)
{
OnStarting(args);
//dosomthing
_testQuartzService.Start();
OnStarted();
} protected sealed override void OnStop()
{
Log.Info($"{base.ServiceName}服务关闭");
OnStopping();
try
{
_testQuartzService.Stop();
}
finally
{
OnStopped();
}
} /// <summary>
/// Executes before ASP.NET Core starts.
/// </summary>
/// <param name="args">The command line arguments passed to the service.</param>
protected virtual void OnStarting(string[] args) { } /// <summary>
/// Executes after ASP.NET Core starts.
/// </summary>
protected virtual void OnStarted() { } /// <summary>
/// Executes before ASP.NET Core shuts down.
/// </summary>
protected virtual void OnStopping() { } /// <summary>
/// Executes after ASP.NET Core shuts down.
/// </summary>
protected virtual void OnStopped() { }
}
HostService
6.尝试启动

三、安装为windows服务
1.编辑TestQuartzService.csproj
添加 <RuntimeIdentifier>win-x64-corert</RuntimeIdentifier>

2.Main的引用添加(不添加release会报错,因为使用了 var servicesToRun = new ServiceBase[] { hostService };)
using System.ServiceProcess;
3.点击发布

这下就会在 netcoreapp2.0\win-x64-corert 出现

有了这个exe就可以进行第四步了
4.管理员打开CMD
输入以下
sc create TestQuartzService binpath=E:\liuyue\TestQuartzService\TestQuartzService\bin\Release\netcoreapp2.0\win-x64-corert\TestQuartzService.exe

看到

5、打开服务找到

点启动
看到日志有日志不断输出

四、完结
值得注意一点就是,各种config、xml文件,记得copy always。
到这就弄完了。有什么问自己,翻源码去吧
.Net Core 2.0 的 ConsoleApp 搭建 Quartz(xml配置)windows服务的更多相关文章
- Quartz+TopShelf实现Windows服务作业调度
Quartz:首先我贴出来了两段代码(下方),可以看出,首先会根据配置文件(quartz.config),包装出一个Quartz.Core.QuartzScheduler instance,这是一个调 ...
- 基于.net core 2.0+mysql+AceAdmin搭建一套快速开发框架
前言 .net core已经出来一段时间了,相信大家对.net core的概念已经很清楚了,这里就不再赘述.笔者目前也用.net core做过一些项目,并且将以前framework下的一些经验移植到了 ...
- win10下ASP.NET Core 2.0部署环境搭建(转)
此文用于记录在win10环境下,新建的Asp.net Core 2.0 Web应用项目如何运行在IIS上 一.运行环境 操作系统: Window10 家庭中文版 版本 10.0.15063 版本 15 ...
- Quartz.Net在windows服务中的使用
写在前面 这几天在弄一个项目,需要定时抓取一些数据,当时也想直接用timer算了.因为之前也弄过这样的项目,但是一想,已经用过了,再去使用同一种思路,未免太乏味了.就换了一种新玩法.这里将之前看到的一 ...
- 使用 Topshelf 结合 Quartz.NET 创建 Windows 服务
Ø 前言 之前一篇文章已经介绍了,如何使用 Topshelf 创建 Windows 服务.当时提到还缺少一个任务调度框架,就是 Quartz.NET.而本文就展开对 Quartz.NET 的研究,以 ...
- 利用Topshelf把.NET Core Generic Host管理的应用程序部署为Windows服务
背景 2019第一篇文章. 此文源于前公司在迁移项目到.NET Core的过程中,希望使用Generic Host来管理定时任务程序时,没法部署到Windows服务的问题,而且官方也没给出解决方案,只 ...
- Quartz和TopShelf Windows服务作业调度
上一次写了一遍关于Quartz作业调度的文章 Quartz.NET 作业调度使用 现在使用TopShelf和Quartz实现windows服务作业调度 TopShelf版本4.0 Quartz版本3. ...
- Quartz.net创建windows服务
序言 安装服务 sc create XXService binpath= "XXService.exe" start= auto sc description XXService ...
- servlet3.0以后可以不用web.xml配置了
AbstractDispatcherServletInitializer 注意:删除了web.xml会报错,web.xml is missing and <failOnMissingWebXml ...
随机推荐
- hive 创建/删除/截断 表(翻译自Hive wiki)
这里罗列常用操作,更多参考 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL- ...
- SpringBoot2.0实现静态资源版本控制
写在最前面 犹记毕业第一年时,公司每次发布完成后,都会在一个群里通知[版本更新,各部门清理缓存,有问题及时反馈]之类的话.归根结底就是资源缓存的问题,浏览器会将请求到的静态资源,如JS.CSS等文件缓 ...
- 公司培训lesson 1-代码质量
课堂讲义 代码质量五大原则 编码规范 命名规范.学会合理科学的命名类名.方法名.变量名.命名宗旨:简洁明了,见名只意:了解常用单词缩写 注释.是否写根据所处工作环境的需要而决定.将以源代码写成以“注释 ...
- python 构造mysql爆破器
前言: 今天已经期末考完,睡了个觉起床写了个 mysql爆破器. 思路: 1.爆破用户->用户存在的话不会报错反之报错 2.爆破密码->密码正确不会报错反之报错 3.用户名和密码一起爆破- ...
- 「小程序JAVA实战」小程序视频处理工具ffmpeg(47)
转自:https://idig8.com/2018/09/16/xiaochengxujavashizhanxiaochengxushipinchuligongjuffmpeg46/ 前面已经把视频成 ...
- 有单例模式 Singleton 涉及的一些防止类被继承的东西
c#中 : ------------------------------- 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. java中: ------------------ ...
- Jboss:The LogManager was not properly installed (you must set the "java.util.logging.manager" system prop
可能是jboss的服务器版本选择不对 ,比如我本地的Jboss服务器版本是 jboss-as-web-7.0.2.Final,选择的服务器版本是JBOOS V7.1 Runtime ,就会报上面 ...
- eclipse中使用maven的 maven install
windows -> preferences -> Java -> Installed JREs 在default VM arguments 中添加 -Dmaven.multiMod ...
- word2vec 细节解析1
count.extend(collections.Counter(list1).most_common(2))表示:使用collections.Counter统计list1列表重单词的频数,然后使用m ...
- 【BZOJ2806】Cheat 【广义后缀自动机+单调队列优化dp+二分】
题意 有M篇标准作文组成了一个作文库(每篇作文都是一个01的字符串),然后给出N篇作文(自然也是01字符串).如果一个长度不小于L的串在作文库中出现过,那么它是熟悉的.对于某一篇作文,我们要把它分为若 ...