Client 客户端AspNetCore.SignalR 通讯服务器 Quartz 执行任务

背景

  需要Client跑服务在终端间隔执行任务,我的目标是运行在树莓派上

Client代码

       如果未连接成功时隔3秒重新连接服务器

        public static void Reconnect()
        {
            var isLink = false;
            do
            {
                Thread.Sleep(3000);//3秒
                isLink = Signalr().GetAwaiter().GetResult();
            } while (!isLink);
        }

  通过命令开启 Quartz 调度器

        public static async Task<bool> Signalr()
        {
            System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
            stopwatch.Start(); //  开始监视代码运行时间
            var urlstr = "https://localhost:44363//hubs";
            var url = new Uri(urlstr);
            var connection = new HubConnectionBuilder()
                               .WithUrl(url)
                               .Build();
            hubConnection = connection;
            connection.On<int, string>("SendCmd", (cmd, data) =>
            {
                switch (cmd)
                {
                    case 10001:
                        if (scheduler == null)
                        {
                            InJobAsync().Wait();
                        }
                        else
                        {
                            if (scheduler.IsStarted != true)
                            {
                                InJobAsync().Wait();
                            }
                            else
                            {

                                connection.SendAsync("ClientMsg", "正在运行");
                            }
                        }

                        break;
                    case 10010:
                        var send = 10;
                        Int32.TryParse(data, out send);
                        if (scheduler != null)
                            scheduler.Clear();
                        InJobAsync(send).GetAwaiter().GetResult();
                        break;
                    default:
                        connection.SendAsync("ClientMsg", "未知命令");
                        break;
                }
            });
            connection.Closed += e =>
            {
                if (e != null)
                {
                    Console.WriteLine("Connection closed..." + e.Message);
                }
                else
                {
                    Console.WriteLine("开始重连..." + e.Message);

                }
                Reconnect();
                return Task.CompletedTask;
            };
            try
            {
                Console.WriteLine($"开始连接服务器[{urlstr}]");
                await connection.StartAsync();
                stopwatch.Stop(); //  停止监视
                TimeSpan timespan = stopwatch.Elapsed; //  获取当前实例测量得出的总时间
                double seconds = timespan.TotalSeconds;  //  总秒数
                Console.WriteLine($"耗时:{seconds} 服务器[{urlstr}]连接成功!");
                return true;
            }
            catch (Exception err)
            {
                stopwatch.Stop(); //  停止监视
                TimeSpan timespan = stopwatch.Elapsed; //  获取当前实例测量得出的总时间
                double seconds = timespan.TotalSeconds;  //  总秒数
                var meg = $"执行时间:{seconds} 连接失败:{err.Message}";
                Console.WriteLine(meg);
                return false;
            }
        }

  

public static StdSchedulerFactory factory = null;
        public static IScheduler scheduler = null;
        public static async Task InJobAsync(int iInterval = 10)
        {

            if (factory == null)
            {
                factory = new StdSchedulerFactory();
            }
            if (scheduler == null)
            {
                scheduler = await factory.GetScheduler();
            }



            // 启动任务调度器
            await scheduler.Start();

            IJobDetail job = JobBuilder.Create<FlowerJob>()
                    .WithIdentity("job1", "group1")
                    .WithDescription("定时数据传送")
                    .Build();
            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
                .WithIdentity("trigger1") // 给任务一个名字
                                          //.StartAt(myStartTime) // 设置任务开始时间
                .ForJob("job1", "group1") //给任务指定一个分组
                .WithSimpleSchedule(x => x
                    .WithIntervalInSeconds(iInterval)  //循环的时间
                    .RepeatForever())
                .Build();


            // 开启任务调度器
            await scheduler.ScheduleJob(job, trigger);

        }

  

Jobs任务

 

public class FlowerJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            //Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}执行任务:"+context.JobDetail.Description);

            //逻辑代码
            
            return Task.CompletedTask;
        }
}

  

posted @ 2019-04-15 10:44  摇光Summer  阅读(548)  评论(0编辑  收藏  举报