簡化 MSMQ 呼叫並實現可替換性,核心解決兩大痛點:
MessageLocation.InQueue);> 4MB 透過網路共享檔案儲存 (MessageLocation.InNetwork)。MessageWrapper,內嵌型別名稱、模組名與 XML 內容,實現自動 XML 化。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);
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/