日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

消息队列工具类(MSMQ)

發布時間:2023/12/13 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 消息队列工具类(MSMQ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

所要做的是簡化msmq的調用代碼以及做到可替代性,實現后,調用消息隊列代碼變為如下所示:

QueueService srv = QueueService.Instance();

//檢查存儲DTO1的隊列是否存在,如不存在則自動建立
srv.Prepare<DTO1>();

//發送類型為DTO1的消息
srv.Send<DTO1>(new DTO1() {  p1="1",  p2="2" });

//發送類型為DTO1的消息,并且將發送的消息Id保存到msgId變量中
string msgId=srv.Send<DTO1>(new DTO1() { p1 = "1", p2 = "2" });

//接收末尾消息
DTO1 msg = srv.Receive<DTO1>();

//接收末尾消息,并且將這個消息Id保存在msgId變量中
DTO1 msg = srv.Receive<DTO1>(ref msgId);

//發送回復消息,并且指定這個回復消息是特定消息ID所專有的回復消息
srv.SendResponse<DTO1>(msg, msgId);

//接收特定消息ID的回復消息
msg=srv.ReceiveResponse<DTO1>(msgId);

主要的地方有2個:

msmq消息大小限制的突破(4M突破)
泛型T對象的序列化、反序列化

突破大小限制

如果大小在4M內,則直接msmq封裝(MessageLocation=InQueue)
如果在4M外,則通過網絡共享文件來封裝(MessageLocation=InNetwork)

泛型T對象的序列化、反序列化

固定住所要傳遞的對象類型為MessageWrapper
在MessageWrapper內部嵌入用戶想要傳遞的其他對象以及相應的type、module名,這樣MessageWrapper就能進行自動xml化以及反xml化了

MessageWrapper代碼如下:

public class MessageWrapper
    {
        private ShareFileBroker fileBroker;
        public MessageWrapper()
        {
            PersistenceType = MessageLocation.InQueue;
            fileBroker = new ShareFileBroker(FileService.FileService.Instance());
        }

        public string RealObjectType { get; set; }
        public string RealObjectModule { get; set; }
        public string RealObjectXml { get; set; }
        public string NetworkLocation { get; set; }
        public MessageLocation PersistenceType { get; set; }

        public void Inject<T>(T obj)
        {
            this.RealObjectType = typeof(T).FullName;
            this.RealObjectModule = typeof(T).Module.Name;
            string xml = SerializeUtils.Serialize2XML(typeof(T), obj);
            SaveXML(xml);
        }
        public T Extract<T>()
        {
            Assembly assembly = AppDomain.CurrentDomain.Load(this.RealObjectModule.TrimEnd(".dll".ToCharArray()));
            Type type = assembly.GetType(this.RealObjectType);
            string xml = GetXML();
            return (T)SerializeUtils.DeserializeFromXML(type, xml);
        }

        private string GetXML()
        {
            string xml = "";
            if (this.PersistenceType == MessageLocation.InQueue)
                xml = this.RealObjectXml;
            else if (this.PersistenceType == MessageLocation.InNetwork)
                xml = fileBroker.GetContentAndDelete(this.NetworkLocation);
            return xml;
        }
        private void SaveXML(string xml)
        {
            if (xml.Length > QueueConfiguration.QueueConfiguration.MaxQueueBodyLength)
            {
                this.NetworkLocation = fileBroker.Save(xml);
                this.PersistenceType = MessageLocation.InNetwork;
            }
            else
            {
                this.RealObjectXml = xml;
                this.PersistenceType = MessageLocation.InQueue;
            }
        }
    }

代碼比較簡單,就不介紹了。

總結

以上是生活随笔為你收集整理的消息队列工具类(MSMQ)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。