Host服务

article/2025/7/9 4:41:17

 

这也是看网上的例子自己跟着配置做的一个小demo,这里记录一下。

一、创建一个空的控制台应用程序

二、安装所需dll 

  1.Quartz 
    Install-Package Quartz -Version 2.3.3
  2.Owin
    Install-Package Owin -Version 1.0.0(这个暂时装上)
  3.TopShelf
    Install-Package TopShelf -Version 3.3.1
  4.log4net
    Install-Package log4net -Version 2.0.8
  5.TopShelf.log4net
    Install-Package Topshelf.Log4Net -Version 3.3.1

 这里我把版本都标记出来是因为NuGet安装的时候有可能最新的版本会不兼容的问题,如果出现请降版本安装。

三、手动创建

  1.log4net.config

  

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/></configSections><log4net><appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"><!--日志路径--><param name= "File" value= "Log\"/><!--是否是向文件中追加日志--><param name= "AppendToFile" value= "true"/><!--log保留天数--><param name= "MaxSizeRollBackups" value= "10"/><!--日志文件名是否是固定不变的--><param name= "StaticLogFileName" value= "false"/><!--日志文件名格式为:2008-08-31.log--><param name= "DatePattern" value= "yyyy-MM-dd&quot;.read.log&quot;"/><!--日志根据日期滚动--><param name= "RollingStyle" value= "Date"/><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%date{HH:mm:ss,fff} %-5p-%m%n" /></layout></appender><!-- 控制台前台显示日志 --><appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"><mapping><level value="ERROR" /><foreColor value="Red, HighIntensity" /></mapping><mapping><level value="Info" /><foreColor value="Green" /></mapping><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" /></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="Info" /><param name="LevelMax" value="Fatal" /></filter></appender><root><!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --><level value="all" /><appender-ref ref="ColoredConsoleAppender"/><appender-ref ref="RollingLogFileAppender"/></root></log4net>
</configuration>
View Code

  2.quartz.config

# You can configure your scheduler in either <quartz> configuration section
# or in quartz properties file
# Configuration section has precedencequartz.scheduler.instanceName = QuartzTest# configure thread pool info
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# export this server to remoting context
#quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz
#quartz.scheduler.exporter.port = 560
#quartz.scheduler.exporter.bindName = QuartzScheduler
#quartz.scheduler.exporter.channelType = tcp
#quartz.scheduler.exporter.channelName = httpQuartz
View Code

  3.quartz_jobs.xml

<?xml version="1.0" encoding="utf-8" ?>
<!-- This file contains job definitions in schema version 2.0 format --><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><!--TestJob测试 任务配置 --><job><name>TestJob</name><group>Test</group><description>TestJob测试</description><job-type>HostProject.QuartzJobs.TestJob,HostProject</job-type><durable>true</durable><recover>false</recover></job><trigger><cron><name>TestJobTrigger</name><group>Test</group><job-name>TestJob</job-name><job-group>Test</job-group><!-- 从start-time起,每5s执行一次IJob.Execute --><start-time>2012-01-22T00:00:00+08:00</start-time><cron-expression>0/5 * * * * ?</cron-expression></cron></trigger></schedule>
</job-scheduling-data>
View Code

四、创建 ServiceRunner.cs

 public class ServiceRunner : ServiceControl, ServiceSuspend{private readonly IScheduler _IScheduler;public ServiceRunner(){_IScheduler = StdSchedulerFactory.GetDefaultScheduler();}public bool Start(HostControl hostControl){_IScheduler.Start();return true;}public bool Stop(HostControl hostControl){_IScheduler.Shutdown();return true;}public bool Continue(HostControl hostControl){_IScheduler.ResumeAll();return true;}public bool Pause(HostControl hostControl){_IScheduler.PauseAll();return true;}}
View Code

五、TestJob

  public sealed class TestJob:IJob{public void Execute(IJobExecutionContext context){CommonHelper.AppLogger.InfoFormat("TestJob测试");try{//模拟调用存储过程,更新商品库存string connStr = "Data Source=.;Initial Catalog=test;User Id=sa;Password=p@ss!123;";using (SqlConnection conn = new SqlConnection(connStr)){using (SqlCommand cmd = new SqlCommand()){conn.Open();cmd.Connection = conn;cmd.CommandType = CommandType.StoredProcedure;cmd.CommandText = "proc_UpdateInventory";Random random = new Random();SqlParameter[] paras = new SqlParameter[]{new SqlParameter(){ParameterName = "@GoodsId",SqlDbType = SqlDbType.Int,Value =  random.Next(1, 4)},new SqlParameter(){ParameterName = "@Inventory",SqlDbType = SqlDbType.Int,Value = random.Next(1, 100)}};cmd.Parameters.AddRange(paras);int rowCount = cmd.ExecuteNonQuery();   //exec proc_UpdateInventory @GoodsId=1,@Inventory=25if (rowCount > 0)CommonHelper.AppLogger.InfoFormat("商品:{0},库存已更新,新的库存为:{1}", paras[0].Value, paras[1].Value);elseCommonHelper.AppLogger.InfoFormat("更新商品库失败,无受影响记录:{0}", rowCount);}}}catch (Exception ex){CommonHelper.AppLogger.ErrorFormat("UpdateInventoryJob 作业执行异常:{0}", ex);}}}
View Code

六、CommonHelper

  class CommonHelper{public static readonly ILog AppLogger = log4net.LogManager.GetLogger("ColoredConsoleAppender");static CommonHelper() { }}
View Code

七、Program中代码调用

 static void Main(string[] args){XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));HostFactory.Run(x => {x.UseLog4Net();x.Service<ServiceRunner>();x.RunAsLocalSystem();x.SetDescription("Quartz+TopShelf实现Windows服务作业调度的一个示例Demo");x.SetDisplayName("QuartzTopShelfDemo服务");x.SetServiceName("QuartzTopShelfDemoService");x.EnablePauseAndContinue();});}
View Code

八、特别注意

 

 这三个文件手动创建,默认是“不复制”,这里需要修改为“始终复制”

这样一个Host便可以运行起来了。

九、安装到Windows

用cmd命令行打开这个文件夹

执行命令  : HostProject.exe install

卸载:HostProject.exe uninstall

十、SQL脚本(先把存储过程执行过在运行项目)

IF ( OBJECT_ID('Goods', 'U') IS NOT NULL )DROP TABLE Goods;GOCREATE TABLE Goods(Id INT IDENTITY(1, 1)NOT NULL ,Name NVARCHAR(30) NOT NULL ,Inventory INTNOT NULLCONSTRAINT PK_Goods_Id PRIMARY KEY CLUSTERED ( Id ASC ) ON [PRIMARY])
ON  [PRIMARY];INSERT  INTO Goods
VALUES  ( '大米', 0 ),( '香蕉', 0 ),( '苹果', 0 );SELECT  *
FROM    Goods;IF ( OBJECT_ID('proc_UpdateInventory', 'P') IS NOT NULL )DROP PROCEDURE proc_UpdateInventory;GOCREATE PROCEDURE proc_UpdateInventory(@GoodsId INT ,@Inventory INT)
ASUPDATE  GoodsSET     Inventory = @InventoryWHERE   Id = @GoodsId;GO
View Code

 

十一、说明

  这里没有对使用进行说明,还有Owin的还没用,后面有时间会补上。

十二、效果

 

转载于:https://www.cnblogs.com/myloveblogs/p/9960129.html


http://chatgpt.dhexx.cn/article/eSPj4hY1.shtml

相关文章

Go get http 服务

阅读目录 package mainimport ("encoding/json""fmt""net/http" )type MirageIPResponse struct {Code string json:"code"MirageIP string json:"MirageIp" }func main() {// 定义处理函数handler : func(w http.Respo…

google host地址

2019独角兽企业重金招聘Python工程师标准>>> http://git.oschina.net/AlexKing/host 保持更新中。。。 亲测通过&#xff0c;如果无法使用可以联系我&#xff0c;再做更新调整。 转载于:https://my.oschina.net/u/260921/blog/506286

virtio,vhost 和vhost-user

virtio 在虚拟机中&#xff0c;可以通过qemu模拟e1000网卡&#xff0c;这样的经典网卡一般各种客户操作系统都会提供inbox驱动&#xff0c;所以从兼容性上来看&#xff0c;使用类似e1000的模拟网卡是非常一个不错的选择。 但是&#xff0c;e1000网卡上也包含了复杂的io端口&a…

GO的服务

1.go的安装 1.1 确认版本go version go version go1.20.4 darwin/amd64 可以看到是macos10.14版本。如果是m1 需要安装对应的版本 1.2 用vscode 进行编写go的简单例子 先进入vscode的界面&#xff0c;新建一个目录为godemo&#xff0c;里面就是go的例子的工作目录&#xff0…

Go Registry

实现微服务的服务注册中心&#xff0c;支持服务服务注册、接收心跳等。客户端实现基于注册中心的服务发现机制 微服务 微服务是一些协同工作的小而自治的服务 微服务主要分为六个部分组成 服务描述&#xff1a;类似服务的文档说明&#xff0c;简单但不可或缺。 比如&#xff1a…

Gogs私服搭建

1. Gogs介绍 官网地址&#xff1a;https://gogs.io 文档地址&#xff1a;https://gogs.io/docs Gogs&#xff0c;全称为Go Git Service&#xff0c;是一个基于 Go 语言开发的Git服务。它提供了一个类似于GitHub的界面和功能&#xff0c;允许您在自己的服务器上搭建私有的Git仓库…

vhost-user

1&#xff0c;virtqueue 图一 每个queue实际上是由tx/rx两个virtqueue组成的也就是说tx和rx的virtqueue是分开的&#xff0c;并没有共享。一个virtio net设备最多有多少个queue由后端vhost决定&#xff0c;但前端可以通过ethtool –L eth0 combined 16命令动态修改当前队列数&…

gohost -- go 开发的命令行hosts配置管理工具

前几天在微博上看到有人推荐了lazygit这个工具&#xff0c;让人眼前一亮&#xff0c;什么时候命令行也可以这么抢到了&#xff0c;?&#xff0c;调研了下&#xff0c;发现它使用了gocui&#xff0c;使用它可以做出来很多很炫的命令行工具。 现有的hosts工具里面也有switchosts…

Android studio占用C盘资源的解决方法

Android studio占用C盘资源的解决方法 Android Studio安装成功后会在系统盘用户目录下产生这几个文件夹 一、目录介绍 1、.android 是Android SDK生成的AVD&#xff08;Android Virtual Device Manager&#xff09;即模拟器存放路径 2、.AndroidStudio4.0&#xff08;这里我安…

Minecraft神奇玩家不用键盘,行走全部靠骑猪最后通关MC

大家好&#xff0c;在Minecraft中有非常多的玩法&#xff0c;但是您听说过全程游戏不用键盘只用鼠标通关的玩法吗&#xff1f;也就是说在游戏中不能使用WSAD和空格按键通关&#xff01;这听起来简直就是天方夜谈了&#xff01; 在国外有位玩家叫做HeightAdvantage的玩家&#…

2021大树分享收集的网盘搜索站给兄弟们

聚合网盘搜索 https://www.chaonengso.com/ 某柠檬 https://www.moulem.com/ 史莱姆 http://www.slimego.cn/ 蓝菊花-城通网盘 http://www.lanjuhua.com google Drive搜索引擎 https://gezhong.vip/ 陈蛋蛋的宝藏库 http://www.chendandan.ys168.com/ xx资料网 https://www.xxu…

WPF窗体最小化到任务栏

WPF程序也可以很轻松的实现类似QQ那样最小化到任务栏的功能。 WindowState ws;WindowState wsl;NotifyIcon notifyIcon;

android ip格式化输入法,手机键盘还能这样玩?简单几步,让你的输入法萌动可人!...

玩手机&#xff0c;打字忙&#xff0c;输入法你用的是原厂、还是第三方&#xff1f;相信大多数网友跟我一样&#xff0c;换了新手机&#xff0c;会在第一时间安装自己习惯的第三方输入法。 相对而言&#xff0c;我更喜欢百度输入法&#xff0c;它的优势之一便是拥有种类丰富、脑…

渗透测试 ( 1 ) --- 相关术语、必备 工具、导航、全流程总结、入侵网站思路

From&#xff1a;https://zhuanlan.zhihu.com/p/401413938 渗透测试实战教学&#xff1a;https://www.zhihu.com/column/c_1334810805263515648 导航类网站&#xff1a; 渗透师网络安全从业者安全导航&#xff08;速查小手册&#xff09;​ 渗透师导航&#xff1a;https…

csgo原始输入开不开_CSGO职业哥参数配置:帅气猪猪JW

在CSGO游戏中,狙击手一直都扮演着团队中非常重要的位置,无论是进攻还是防守,利用狙击的远距击杀,不仅能够造成人数上面的领先,同时还可以打乱对方的战术安排部署,是真正的牵一发而动全身的关键位置。 那么,我们今天来介绍的是这么一位狙击手,CSGO圈中是这么评价他的:在…

dialog dismiss时键盘不消失的问题。

当setCanceledOnTouchOutside(true)&#xff0c;点击阴影处&#xff0c;dialog dismiss时键盘不消失的问题。 一开始觉得很简单&#xff0c;监听下onDimiss&#xff08;&#xff09;方法&#xff0c;在里面隐藏键盘不就行了。 但是发现大多数手机都不会隐藏&#xff08;魅族x4…

pe没法给服务器装系统吗,U盘重装系统无法进入PE解决方法

使用U盘启动盘重装系统&#xff0c;进不去PE怎么办&#xff1f;制作好U盘启动盘&#xff0c;准备装系统的时候&#xff0c;遇到不能进入PE的情况该怎么解决&#xff1f;下面小编整理一篇教程&#xff0c;帮助大家解决这个问题。 首先先分析u盘装系统不能进入pe的原因&#xff1…

真正的黑客键盘

IT程序猿 微博网友评论&#xff1a; 金先生不睡觉&#xff1a;甚至没有退格键&#xff01; O2酱&#xff1a;复读机的键盘&#xff1a;Ctrl&#xff0c;C&#xff0c;V 蓝天草地生活&#xff1a;高手专用&#xff01; 吴彦猪猪_yzy&#xff1a;其实不需要done 某个序列表示don…

LeetCode500. 键盘行

项目场景&#xff1a; 行百里路者半九十 问题描述 键盘行 给你一个字符串数组 words &#xff0c;只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 美式键盘 中&#xff1a; 第一行由字符 “qwertyuiop” 组成。 第二行由字符 “asdfghjkl” 组成…