-
定时数据采集入队列,并出队上传http服务作者 : Jacky 发布于 2023-05-26 10:52:43 浏览 660 次
记得nuget安装 xiaofeng.Core 包
安装netcore的模式,我添加一个定时服务
///
/// 任务调度 启动服务 /// public static class JobSetup { public static void AddJobSetup(this IServiceCollection services) { if (services == null) throw new ArgumentNullException(nameof(services)); var job = new XiaoFeng.Threading.Job { Name = "定时执行上传作业", TimerType = XiaoFeng.Threading.TimerType.Interval, Period = WebConfig.Current.Frequency * 60 * 1000, CompleteCallBack = j => { string dataStr= "本次采集的标识,你的业务数据,或者对象 或者 字符串"; var cmdline = $"在控制台的命令 cmd 或者 shell 程序内部会判读系统"; var result = XiaoFeng.Device.Computer.CmdExecute(cmdline); var cmdline1 = $""; var result1 = XiaoFeng.Device.Computer.CmdExecute(cmdline1); MyTastkQuee.TaskQuee.AddWorkItem(dataStr); } }; job.Start(); //把当前的任务存到字典里,后期我们想停止或修改任务,就可以从字典取出来 MyJobModel.MyJobDics.Add(job.Name, job); } }上面的服务写好了,在
Program.cs
里就可以添加你的服务了。var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddJobSetup();
如果感觉麻烦,直接把定时任务的代码,放到
Program.cs
上。
上面的定时任务肯定有报错的地方
1、WebConfig.Current
2、MyTastkQuee.TaskQuee.AddWorkItem
没错,1是配置文件,2是队列。
下面我们使用配置文件。首先,我们创建一个类
WebConfig.cs
[ConfigFile("Config/WebConfig.json", 0, "CACHE-WEBCONFIG", XiaoFeng.ConfigFormat.Json)] public class WebConfig : ConfigSet
{ /// /// 名称 /// [Description("名称")] public string Name { get; set; } ////// 是否初始化 /// [Description("是否初始化")] public int Init { get; set; } ////// 频率-分钟/次 /// [Description("频率-分钟/次")] public int Frequency { get; set; } }文件中,
[ConfigFile("Config/WebConfig.json", 0, "CACHE-WEBCONFIG", XiaoFeng.ConfigFormat.Json)]
这个是配置文件的路径,缓存,格式等,按照自己的需求修改,有枚举注释可以参考。
里面的字段,按照你的需求进行写。
下面就是生成json的步骤了,找到程序启动的地方,例如main函数下面。var wConfig = WebConfig.Current; //直接调用 wConfig.Frequency = 1; wConfig.Init = 1; wConfig.Name = "上传频次配置"; //修改 保存 wConfig.Save();
执行完,看看你程序的根目录,有个
Config/WebConfig.json
里面就是生成的json文件了。生成的json如何调用里面的数据呢?
比如我要获取频率时间:WebConfig.Current.Frequency
数据就出来了,然后定义一个接参的类型。
var frequency=WebConfig.Current.Frequency;注意:例如main函数下面生成 json的代码,建议初始化的就执行一次,后续不增加配置字段,不用执行了。
如果增加字段了,不想执行,那就手工加配置就行了,这个只是帮你快速生成的辅助工具。下面讲解队列的使用,
MyTastkQuee.TaskQuee.AddWorkItem(dataStr);
首先定义一个类,MyTastkQuee.cs
名字可以自定义public class MyTastkQuee : TaskServiceQueue
//如果你的数据是对象,这里string 修改你的model类 { public static MyTastkQuee TaskQuee { get; set; } = new MyTastkQuee(); public override async Task ExecuteAsync(string dataStr, CancellationToken cancellationToken) { /* 从队列取出数据,这里进行执行 */ System.Console.WriteLine("ExecuteAsync"); System.Console.WriteLine(dataStr); 如果此时你想把数据,推送指定http服务,使用xiaofeng模拟网络请求HttpHelper工具类 var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest { Method = HttpMethod.Post, ContentType="application/json", Address = "http://www.fayelf.com", BodyData=@"{""account"":""jacky"",""password"":""123456""}" }); if (result.StatusCode == System.Net.HttpStatusCode.OK) { /*请求成功*/ //响应内容 var value = result.Html; //响应内容字节集 var bytes = result.Data; } else { /*请求失败*/ } [http传送地址](https://www.eelf.cn/Article/A3B2E51D3D154C1AA6B7648E9127D52F "http传送地址"): } } 好了,整体是讲完了。
此时你可以写一个 webapi接口,获取你的配置文件。
例如:///
/// 获取任务频率 /// ///[HttpGet("GetFrequency")] public int GetFrequency() { return WebConfig.Current.Frequency; } /// /// 设置频率 /// /// 频率 ///[HttpPost("SetFrequency")] public bool SetFrequency(int frequency) { //CacheHelper.Set("FREQUENCY", frequency); var wconfig = WebConfig.Current; wconfig.Frequency = frequency; wconfig.Save(); return true; } 回到我们执行定时任务,添加了一个字典,这里我定义了全局静态
MyJobModel.cs
类。public static class MyJobModel { ///
/// my jjob /// public static DictionaryMyJobDics { get; set; }= new Dictionary (); } 如果此时,你修改了频率,想更新定时任务,这样操作
///
/// 设置频率 /// /// 频率 ///[HttpPost("SetFrequency")] public bool SetFrequency(int frequency) { //CacheHelper.Set("FREQUENCY", frequency); var wconfig = WebConfig.Current; wconfig.Frequency = frequency; wconfig.Save(); var myjob= MyJobModel.MyJobDics["定时执行上传作业"]; if (myjob != null) { myjob.Stop(); myjob.Period = frequency; myjob.Start(); } return true; } 如果有些作业执行完,就想移除了,节省内存空间,直接这样使用。
JobScheduler.Default.Remove(job1.ID);
JobScheduler.Default.Remove(job1.Name);另外,如果想使用缓存机制,可以直接这样使用
CacheHelper.Set(“FREQUENCY”, frequency);所有评论(0)