MSMQ 消息队列、监听MSMQ消息、消息扫描

namespace FSMP.PTS.MSMQ
{
   public class MSMQHelper
    {
        /// <summary>
        /// MSMQ服务地址配置
        /// </summary>
        public static string MsmqString
        {
            get
            {
                string Name = "fsmpptsmsmq";
                return string.Format(@".\Private$\{0}", Name);
            }
        }
 
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="head">标识码</param>
        /// <param name="json">json数据</param>
        /// <param name="Priority">级别</param>
     public static bool SendMessage(int head, string json, System.Messaging.MessagePriority Priority)
        {
            bool IsTrue = false;
            try
            {
                System.Messaging.MessageQueue mq = null;
		//队列消息名称是否存在
                if (System.Messaging.MessageQueue.Exists(MsmqString))
                {
                    mq = new System.Messaging.MessageQueue(MsmqString);
                    System.Messaging.Message message = new System.Messaging.Message();
                    //为了避免存放消息队列的计算机重新启动而丢失消息,可以通过设置消息对象的Recoverable属性为true,
                    //在消息传递过程中将消息保存到磁盘上来保证消息的传递,默认为false。 
                    message.Recoverable = true;
                    message.Priority = Priority;
                    message.Label = head.ToString();
                    message.Body = json;
                    message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
                    mq.Send(message);
                    IsTrue = true;
                }
                else
                {
		    //此处如果不存在队列,可以创建队列:mq = MessageQueue.Create(MsmqString);
                    Common.WriteToLogFile(String.Format("{0}队列名称不存在!", MsmqString));
                }
            }
            catch (Exception ex)
            {
                Common.WriteToLogFile(string.Format("发送MQ异常错误:{0}", ex.ToString()));
            }
            return IsTrue;
        }
    }
}
namespace FSMP.PTS.Service
{
    public partial class WindowsService : ServiceBase
    {
        public WindowsService()
        {
            InitializeComponent();
        }
 
        System.Timers.Timer timer1;  //计时器
 
        private bool IsStatus = true;
	
        private Thread PuschThread;
        /// <summary>
        /// 定时监控扫描时间
        /// </summary>
        private int IntervalTime = AppConfig.IntervalTime * 60000;
        /// <summary>
        /// N分钟无状态回复则转短信
        /// </summary>
        private int PushSmsMinute = AppConfig.PushSmsMinute;
 
        protected override void OnStart(string[] args)
        {
            timer1 = new System.Timers.Timer();
            timer1.Interval = IntervalTime;  //设置计时器事件间隔执行时间默认15分钟执行一次
            timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
            timer1.Enabled = true;
 
            //监听
            IsStatus = true;
            PuschThread = new Thread(new ThreadStart(RecevieMessage));
            PuschThread.IsBackground = true;
            PuschThread.Start();
            Common.WriteToLogFile("家校宝消息监控服务开始执行!");
        }
 
        protected override void OnStop()
        {
            this.timer1.Enabled = false;
            IsStatus = false;
            Common.WriteToLogFile("家校宝消息监控服务停止执行!");
        }
 
        /// <summary>
        /// 定时扫描消息
        /// </summary>
        /// <param name="e"></param>
        private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            try
            {
                var list = PushToMessage.get_pushtosms(AppConfig.PushSmsMinute);
                int MessageCount = list.Count;
                Common.WriteToLogFile(string.Format("共有{0}条已超出{1}分钟未阅读消息数据", MessageCount, PushSmsMinute));
                if (MessageCount > decimal.Zero)
                {
                    this.timer1.Enabled = false;
                    foreach (var item in list)
                    {
                        var model = new PushToSmsModels.Req_getmobileModel
                        {
                            id = item.userid,
                            key = Common.CreateKey(item.userid)
                        };
                        var json = JsonConvert.SerializeObject(model);
                        var mobile = PushToMessage.get_usermobile(json);
                        var status = decimal.One;
                        //时间超出转为短信发送
                        if (!string.IsNullOrEmpty(mobile) && mobile.Length == 11)
                        {
                            var Custom = new Random(DateTime.Now.Millisecond).Next(10, 98).ToString();
                            var content = item.messagetype == 0 ? string.Format("{0} ({1})", item.content, "请登平台查看") : item.content;
                            var entity = new PushToSmsModels.smssendModel
                            {
                                ID = Common.GetRandomID().ToString(),
                                SchoolCode = item.schoolcode,
                                Mobile = mobile,
                                Content = content,
                                InputDate = DateTime.Now,
                                Status = -1,
                                Description = string.Empty,
                                TaskId = string.Empty,
                                TaskStatus = decimal.MinusOne,
                                TaskType = 0,
                                Custom = Custom,
                                LevelNo = 0,
                                VerifyStatus = 1
                            };
                            var s = PushToMessage.set_smssend(entity);
                            status = s ? decimal.Zero : decimal.One;
                        }
                        else
                        {
                            status = 9;
                            Common.WriteToLogFile(String.Format("手机长度错误,手机号码:{0})", mobile));
                        }
                        var result = PushToMessage.update_pushtosms(item.schoolcode, item.userid, item.messageid, status);
                        Common.WriteToLogFile(String.Format("提交消息状态(schoolcode:{0},userid{1},messageid:{2},status:{3},DB:{4})", item.schoolcode, item.userid, item.messageid, status, result));
                    }
                    //重新开启定时器使用
                    this.timer1.Enabled = true;
                    timer1.Interval = 1000;//1秒钟执行一次
                }
                else
                {
                    timer1.Interval = IntervalTime; //每隔{IntervalTiem}毫秒 执行一次
                }
            }
            catch (Exception ex)
            {
                Common.WriteToLogFile(String.Format("消息监控扫描数据异常:{1}", ex.ToString()));
            }
        }
 
        /// <summary>
        /// 监听
        /// </summary>
        public void RecevieMessage()
        {
            try
            {
                while (IsStatus)
                {
                    if (MessageQueue.Exists(MSMQ.MSMQHelper.MsmqString))
                    {
                        MessageQueue mq = new MessageQueue(MSMQ.MSMQHelper.MsmqString);
                        System.Messaging.Message message = mq.Receive();
                        message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
                        if (message != null)
                        {
                            //消息类型 对应 FSMP.MSMQ.SendMessage.MessageType值
                            var Lable = message.Label.ToString();
                            string Body = message.Body.ToString();
                            Common.WriteToLogFile(string.Format("Lable:{0},Body:{1}", Lable, Body));
                            int success = 0;
                            int fail = 0;
                            if (Lable == ((int)MSMQ.MessageType.Message).ToString())
                            {
                                var messagelist = MSMQ.MessageDeserialize.MessageList(Body);
                                success = 0;
                                fail = 0;
                                foreach (var item in messagelist)
                                {
                                    var s = PushToMessage.set_pushtosms(item.SchoolCode, item.UserId, item.MessageId, (int)MessageType.Message, item.Content, decimal.MinusOne);
                                    if (s)
                                    {
                                        success++;
                                    }
                                    else
                                    {
                                        fail++;
                                    }
                                }
                                Common.WriteToLogFile(string.Format("消息执行完毕,成功:{0},失败:{1}", success, fail));
                            }
                            else if (Lable == ((int)MSMQ.MessageType.MessageRead).ToString())
                            {
                                var messageread = MSMQ.MessageDeserialize.MessageStatus(Body);
                                if (messageread != null)
                                {
                                    var s = PushToMessage.update_pushtosms(messageread.SchoolCode, messageread.UserId, messageread.MessageId, decimal.One);
                                    Common.WriteToLogFile(string.Format("消息执行完毕,执行结果:{0}", s));
                                }
                            }
                            else if (Lable == ((int)MSMQ.MessageType.WorkBook).ToString())
                            {
                                var workbookllist = MSMQ.MessageDeserialize.WorkBoolList(Body);
                                success = 0;
                                fail = 0;
                                foreach (var item in workbookllist)
                                {
                                    var s = PushToMessage.set_pushtosms(item.SchoolCode, item.UserId, item.WorkBookId, (int)MessageType.WorkBook, item.Content, decimal.MinusOne);
                                    if (s)
                                    {
                                        success++;
                                    }
                                    else
                                    {
                                        fail++;
                                    }
                                }
                                Common.WriteToLogFile(string.Format("消息执行完毕,成功:{0},失败:{1}", success, fail));
 
                            }
                            else if (Lable == ((int)MSMQ.MessageType.WorkBookRead).ToString())
                            {
                                var wookbookread = MSMQ.MessageDeserialize.WorkBookStatus(Body);
                                success = 0;
                                fail = 0;
                                if (wookbookread != null)
                                {
                                    var s = PushToMessage.update_pushtosms(wookbookread.SchoolCode, wookbookread.UserId, wookbookread.WorkBookId, decimal.One);
                                    Common.WriteToLogFile(string.Format("消息执行完毕,执行结果:{0}", s));
                                }
                            }
                            else
                            {
                                Common.WriteToLogFile(String.Format("未处理的MQ记录(Lable:{0},Body:{1})", Lable, Body));
                            }
                        }
                        System.Threading.Thread.Sleep(100);
                    }
                    else
                    {
                        Common.WriteToLogFile(String.Format("{0}不存在", MSMQ.MSMQHelper.MsmqString));
                    }
                }
            }
            catch (Exception ex)
            {
                Common.WriteToLogFile(String.Format("接收MQ消息异常错误:{0}", ex.ToString()));
            }
        }
 
    }
}
namespace FSMP.PTS.MSMQ
{
    public class SendMessage
    {
        static void Message(string Body)
        {
            var JsonModel = JsonConvert.DeserializeObject<MSMQModels.JxbMessageModel>(Body);
            if (JsonModel != null)
            {
                var model = new MSMQModels.MessageModel
                {
                    Content = JsonModel.title,
                    MessageId = JsonModel.id,
                    SchoolCode = JsonModel.schoolcode,
                    UserId = JsonModel.userstring
                };
                var JsonString = JsonConvert.SerializeObject(model);
                MSMQHelper.SendMessage((int)MessageType.Message, JsonString, System.Messaging.MessagePriority.High);
            }
            else
            {
                Common.WriteToLogFile("通知公告消息解析失败!");
            }
        }
	
 	
        static void WorkBook(string Body)
        {
            var JsonModel = JsonConvert.DeserializeObject<MSMQModels.JxbMessageModel>(Body);
            if (JsonModel != null)
            {
                var model = new MSMQModels.WorkBookModel
                {
                    Content = JsonModel.title,
                    UserId = JsonModel.userstring,
                    SchoolCode = JsonModel.schoolcode,
                    WorkBookId = JsonModel.id,
                };
                var JsonString = JsonConvert.SerializeObject(model);
                MSMQHelper.SendMessage((int)MessageType.WorkBook, JsonString, System.Messaging.MessagePriority.High);
            }
            else
            {
                Common.WriteToLogFile("作业练习消息解析失败!");
            }
        }

    }
}

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MSMQ是微软的消息队列技术,它是一种企业服务的消息中间件技术,常与企业服务总线一起使用,是企业分布式开发的一部分。使用MQ作为消息中间件可以实现消息的发送和传递之间的解耦,适用于需要分布式架构的系统。 在MQ中,消息队列可以分为静态和动态两种类型。静态消息队列与网络相关联,分为公共队列和专用队列,公共队列是整个网络中所有站点都可以公开访问的,而专用队列只能由知道队列完整路径名或标签的应用程序访问。动态消息队列根据消息接收的操作不同,分为管理队列和响应队列,管理队列包含了整个消息线路中已经发送和接收的消息,而响应队列则用于目标程序接收和回应消息。 MQ的行为方面可以分为队列通信和消息处理两个大的方面。队列通信分为同步和异步两种类型,同步消息是指发送方在执行其他任务之前必须等待接收方的响应,而异步消息则不需要等待接收方的回应就可以继续其他操作。在消息队列交互方面,还有数据完整性、数据一致性、稳定性等类型的考虑,包括消息的优先级、脱机能力、事务性和安全性等。 使用MSMQ,开发者可以通过MessageQueue类对消息队列进行操作。在操作消息之前,需要创建一个存储消息的队列,并为MessageQueue指定消息队列的路径。主要使用的方法和属性包括队列管理和消息管理两类方法,其中队列管理方法用于创建和删除队列,消息管理方法分为同步和异步两种类型,根据实际需求确定使用的类型。主要使用的属性包括Path和Label,Path指定消息队列的地址,Label用于设置或获取队列的描述信息。 总之,MSMQ是微软的消息队列技术,可以实现消息的发送和传递之间的解耦,适用于企业分布式开发。它包括静态和动态消息队列,支持同步和异步消息通信,同时考虑数据完整性、数据一致性和稳定性等因素。开发者可以使用MessageQueue类对消息队列进行管理和操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MSMQ消息队列 用法](https://blog.csdn.net/baihuomeng2210/article/details/101087984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值