首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

MSMQ 訊息佇列工具類:突破 4MB 限制與泛型序列化封裝

     編輯:關於.NET

簡化 MSMQ 呼叫並實現可替換性,核心解決兩大痛點:

  1. 突破 4MB 訊息大小限制:< 4MB 直接佇列儲存 (MessageLocation.InQueue);> 4MB 透過網路共享檔案儲存 (MessageLocation.InNetwork)。
  2. 泛型物件自動序列化/反序列化:統一封裝為 MessageWrapper,內嵌型別名稱、模組名與 XML 內容,實現自動 XML 化。

核心 API 使用範例

QueueService srv = QueueService.Instance();
srv.Prepare<DTO1>(); // 確保佇列存在
srv.Send<DTO1>(new DTO1 { p1="1", p2="2" });
string msgId = srv.Send<DTO1>(new DTO1 { p1="1", p2="2" }); // 取得訊息 ID
DTO1 msg = srv.Receive<DTO1>();
DTO1 msg = srv.Receive<DTO1>(ref msgId);
srv.SendResponse<DTO1>(msg, msgId); // 指定回覆關聯
msg = srv.ReceiveResponse<DTO1>(msgId);

MessageWrapper 實作關鍵

public class MessageWrapper {
    private ShareFileBroker fileBroker;
    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) {
        RealObjectType = typeof(T).FullName;
        RealObjectModule = typeof(T).Module.Name;
        string xml = SerializeUtils.Serialize2XML(typeof(T), obj);
        SaveXML(xml);
    }
    public T Extract<T>() {
        Assembly asm = AppDomain.CurrentDomain.Load(RealObjectModule.TrimEnd(".dll".ToCharArray()));
        Type type = asm.GetType(RealObjectType);
        string xml = GetXML();
        return (T)SerializeUtils.DeserializeFromXML(type, xml);
    }
    private string GetXML() {
        return PersistenceType == MessageLocation.InQueue ? RealObjectXml
            : fileBroker.GetContentAndDelete(NetworkLocation);
    }
    private void SaveXML(string xml) {
        if (xml.Length > QueueConfiguration.MaxQueueBodyLength) {
            NetworkLocation = fileBroker.Save(xml);
            PersistenceType = MessageLocation.InNetwork;
        } else {
            RealObjectXml = xml;
            PersistenceType = MessageLocation.InQueue;
        }
    }
}

此設計讓上層業務完全感知不到大小限制與序列化細節,並支援分散式 Command Bus、Session 讀取等進階場景 (A2D Framework)。

作者:玄魂
出處:https://www.cnblogs.com/xuanhun/

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved