XiaoFeng代码实践 目录
作业调度实时上传
工具库代码实践
定时数据采集入队列,并出队上传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 Dictionary MyJobDics { 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)