• 使用Quartz.Net定时发送消息


    using Microsoft.EntityFrameworkCore.Internal;
    using MongoDB.Bson;
    using Newtonsoft.Json;
    using Player.Common;
    using Player.Common1;
    using Player.DBUtility;
    using Player.Infrastructure.Entities.Chat;
    using Quartz;
    using Quartz.Impl;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Player.Web.AutoServer
    {
        /// <summary>
        /// 定时查询机器人
        /// </summary>
        public class TimerRobotJob : IJob
        {
            /// <summary>
            /// 调度器
            /// </summary>
            public static IScheduler scheduler = null;
    
            public async Task Execute(IJobExecutionContext context)
            {
                try
                {
                    Console.WriteLine($"================开始刷新机器人任务 {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}================");
                    scheduler = context.Scheduler; //获取调度器
                    await RobotChatTask(context);
                }
                catch (Exception ex)
                {
                    LogHelper.DebugLog("任务程序报错:机器人聊天" + ex.Message);
                }
            }
    
            /// <summary>
            /// 机器人聊天
            /// </summary>
            private async Task RobotChatTask(IJobExecutionContext context)
            {
                var sort = new BsonDocument() { new BsonElement("createTime", -1) };//排序
                var list = new MongoDBHelper<ChatRobots>().QueryAll((t) => t.IsEnable && t.IsChat && t.SayTimes.ToList().Contains(DateTime.Now.Hour), sort);
                if(list != null)
                {
                    foreach (var item in list)
                    {
                        if(context != null && context.Scheduler.CheckExists(new JobKey(item.Id.ToString())).Result)
                        {
                            continue;//机器人已存在定时任务,则不需要绑定任务
                        }
                        string cronTime = item.Interval < 60 ? $"0/{item.Interval} * * * * ? " : $"0 0/{item.Interval / 60} * * * ? ";//为true按秒间隔  为false按分钟间隔
                        await CreateJob<TimerSendMsgJob>($"{item.Id}", $"TimerSendRobotJob", cronTime); //定时发送聊天任务
                    }
                }
            }
    
            /// <summary>
            /// 创建运行的调度器
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="name"></param>
            /// <param name="group"></param>
            /// <param name="cronTime"></param>
            /// <returns></returns>
            public static async Task CreateJob<T>(string name, string group, string cronTime) where T : IJob
            {
                //创建一个作业
                var job = JobBuilder.Create<T>()
                    .WithIdentity(name,group)
                    .Build();
    
                //创建一个触发器
                var tigger = (ICronTrigger)TriggerBuilder.Create()
                    .WithIdentity(name,group)
                    .StartNow()
                    .WithCronSchedule(cronTime)
                    .Build();
                //把作业和触发器放入调度器中
                await scheduler.ScheduleJob(job, tigger);
            }
        }
    
        /// <summary>
        /// 定时机器人发言
        /// </summary>
        public class TimerSendMsgJob : IJob
        {
            public async Task Execute(IJobExecutionContext context)
            {
                try
                {
                    string key_id = context.JobDetail.Key.Name; //任务的名称 机器人表objectid
                    var info = new MongoDBHelper<ChatRobots>().QueryByFirst((t) => t.Id == new ObjectId(key_id) && t.IsEnable && t.IsChat && t.SayTimes.ToList().Contains(DateTime.Now.Hour));
                    if (info != null)
                    {
                        double seconds = (context.NextFireTimeUtc - context.FireTimeUtc).Value.TotalSeconds;//下次触发时间 - 当前触发时间 = 间隔时间
                        if (info.Interval != Math.Round(seconds))
                        {
                            //如果两次间隔时间不同,则重新设置触发器的时间
                            if (await context.Scheduler.DeleteJob(new JobKey(key_id, "TimerSendRobotJob")))
                            {
                                string cronTime = info.Interval < 60 ? $"0/{info.Interval} * * * * ? " : $"0 0/{info.Interval / 60} * * * ? ";//为true按秒间隔  为false按分钟间隔
                                await TimerRobotJob.CreateJob<TimerSendMsgJob>(key_id, "TimerSendRobotJob", cronTime);
                            }
                        }
                        int radom = new Random().Next(info.Quotation.Length);//根据机器人语录产生一个随机数
                        await SendMQMsg("RobotChatExchange", "RobotMsgChatQueue", new
                        {
                            info.ChatRoomId,            //房间id
                            info.RobotVIPLevel,         //VIP等级
                            info.RobotNickName,         //昵称 
                            msg = info.Quotation[radom],//随机消息
                            time = DateTime.Now,        //消息时间
                        });
                    }
                    else
                    {
                        await context.Scheduler.DeleteJob(new JobKey(key_id, "TimerSendRobotJob")); //本次小时时间段不需要发言,移除定时任务
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Error(LogType.InfoLog, $"任务程序报错:机器人聊天{ex}");
                }
            }
    
            /// <summary>
            /// 发送MQ消息
            /// </summary>
            /// <param name="exchangeName">通道名称</param>
            /// <param name="queueName">消息名称</param>
            /// <param name="msg">消息内容</param>
            private async Task SendMQMsg(string exchangeName, string queueName, object data)
            {
                await Task.Run(() =>
                {
                    string msg = Utils.ToJson(data);
                    new RabbitMQHelper(exchangeName).SendMsg(queueName, msg);
                    LogHelper.Info(LogType.InfoLog, $"聊天消息:{msg}");
                });
            }
        }
    }
    

      

    using Microsoft.EntityFrameworkCore.Internal;using MongoDB.Bson;using Newtonsoft.Json;using Player.Common;using Player.Common1;using Player.DBUtility;using Player.Infrastructure.Entities.Chat;using Quartz;using Quartz.Impl;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;
    namespace Player.Web.AutoServer{    /// <summary>    /// 定时查询机器人    /// </summary>    public class TimerRobotJob : IJob    {        /// <summary>        /// 调度器        /// </summary>        public static IScheduler scheduler = null;
            public async Task Execute(IJobExecutionContext context)        {            try            {                Console.WriteLine($"================开始刷新机器人任务 {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}================");                scheduler = context.Scheduler; //获取调度器                await RobotChatTask(context);            }            catch (Exception ex)            {                LogHelper.DebugLog("任务程序报错:机器人聊天" + ex.Message);            }        }
            /// <summary>        /// 机器人聊天        /// </summary>        private async Task RobotChatTask(IJobExecutionContext context)        {            var sort = new BsonDocument() { new BsonElement("createTime", -1) };//排序            var list = new MongoDBHelper<ChatRobots>().QueryAll((t) => t.IsEnable && t.IsChat && t.SayTimes.ToList().Contains(DateTime.Now.Hour), sort);            if(list != null)            {                foreach (var item in list)                {                    if(context != null && context.Scheduler.CheckExists(new JobKey(item.Id.ToString())).Result)                    {                        continue;//机器人已存在定时任务,则不需要绑定任务                    }                    string cronTime = item.Interval < 60 ? $"0/{item.Interval} * * * * ? " : $"0 0/{item.Interval / 60} * * * ? ";//为true按秒间隔  为false按分钟间隔                    await CreateJob<TimerSendMsgJob>($"{item.Id}", $"TimerSendRobotJob", cronTime); //定时发送聊天任务                }            }        }
            /// <summary>        /// 创建运行的调度器        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="name"></param>        /// <param name="group"></param>        /// <param name="cronTime"></param>        /// <returns></returns>        public static async Task CreateJob<T>(string name, string group, string cronTime) where T : IJob        {            //创建一个作业            var job = JobBuilder.Create<T>()                .WithIdentity(name,group)                .Build();
                //创建一个触发器            var tigger = (ICronTrigger)TriggerBuilder.Create()                .WithIdentity(name,group)                .StartNow()                .WithCronSchedule(cronTime)                .Build();            //把作业和触发器放入调度器中            await scheduler.ScheduleJob(job, tigger);        }    }
        /// <summary>    /// 定时机器人发言    /// </summary>    public class TimerSendMsgJob : IJob    {        public async Task Execute(IJobExecutionContext context)        {            try            {                string key_id = context.JobDetail.Key.Name; //任务的名称 机器人表objectid                var info = new MongoDBHelper<ChatRobots>().QueryByFirst((t) => t.Id == new ObjectId(key_id) && t.IsEnable && t.IsChat && t.SayTimes.ToList().Contains(DateTime.Now.Hour));                if (info != null)                {                    double seconds = (context.NextFireTimeUtc - context.FireTimeUtc).Value.TotalSeconds;//下次触发时间 - 当前触发时间 = 间隔时间                    if (info.Interval != Math.Round(seconds))                    {                        //如果两次间隔时间不同,则重新设置触发器的时间                        if (await context.Scheduler.DeleteJob(new JobKey(key_id, "TimerSendRobotJob")))                        {                            string cronTime = info.Interval < 60 ? $"0/{info.Interval} * * * * ? " : $"0 0/{info.Interval / 60} * * * ? ";//为true按秒间隔  为false按分钟间隔                            await TimerRobotJob.CreateJob<TimerSendMsgJob>(key_id, "TimerSendRobotJob", cronTime);                        }                    }                    int radom = new Random().Next(info.Quotation.Length);//根据机器人语录产生一个随机数                    await SendMQMsg("RobotChatExchange", "RobotMsgChatQueue", new                    {                        info.ChatRoomId,            //房间id                        info.RobotVIPLevel,         //VIP等级                        info.RobotNickName,         //昵称                         msg = info.Quotation[radom],//随机消息                        time = DateTime.Now,        //消息时间                    });                }                else                {                    await context.Scheduler.DeleteJob(new JobKey(key_id, "TimerSendRobotJob")); //本次小时时间段不需要发言,移除定时任务                }            }            catch (Exception ex)            {                LogHelper.Error(LogType.InfoLog, $"任务程序报错:机器人聊天{ex}");            }        }
            /// <summary>        /// 发送MQ消息        /// </summary>        /// <param name="exchangeName">通道名称</param>        /// <param name="queueName">消息名称</param>        /// <param name="msg">消息内容</param>        private async Task SendMQMsg(string exchangeName, string queueName, object data)        {            await Task.Run(() =>            {                string msg = Utils.ToJson(data);                new RabbitMQHelper(exchangeName).SendMsg(queueName, msg);                LogHelper.Info(LogType.InfoLog, $"聊天消息:{msg}");            });        }    }}

  • 相关阅读:
    20140327工作室日志
    20140326学习工作室日志
    标准连接池实现
    JDBC
    监听器
    数据表多对多
    MATLAB 中几个颜色空间的坐标范围
    RabbitMQ(一)
    Web Service之Axis(二)
    Web Service之CXF(四)
  • 原文地址:https://www.cnblogs.com/nnnnnn/p/13099930.html
Copyright © 2020-2023  润新知