每天用心去做,用行動去改變一些人的觀念,或許是他們的态度,或許是他們的意識.
這樣對我來說都是對這個世界的點點改變,我也對此樂此不疲
今天再次深入了MSMQ,記錄如下吧
MSMQ區域網路通信配置
MSMQ在不啟用http橋時,或在區域網路環境下我們可以使用無安全性的配置,
<security mode="None">
<transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
<message clientCredentialType="None" />
</security>
當然在安全考慮下我們還是需要域管理器或windows安全的,這個不是本節讨論的問題,略過
MSMQ調試清除隊列
1.重寫ServiceHost類的方法OnClosing
2.在使用。net的條件編譯 [Conditional("BEGUG")]
3.調用purge()的方法
MSMQ事務回放機制
注意MSMQ特性,不能為其設定[TransactionFlow(TransactionFlowOption.Allowed)]的任何屬性,在這裡都是無用的。。
如果要使用事務就隻能夠使用操作行為的事務回放機制進行事務傳遞,
參與事務回放
1.單向契約
2.[OperationBehavior(TransactionScopeRequired = true)]
3.用戶端開啟事務
或者你也可以選擇建立獨立事務,當然該事務不是DTC
MSMQ非事務隊列配置
在binding節點下 配置Durable,ExactlyOnce,這樣你的隊列将不具備消息可靠性,也是一個臨時隊列
MSMQ事務性用戶端,與之前事務用法相似,略過..
MSMQ非事務性用戶端,需要将事務屬性調整為TransactionScopeOption.Suppress
MSMQ單例隊列服務
1.需要配置 [ServiceContract(SessionMode=SessionMode.NotAllowed)]
2.需要配置 [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,ReleaseServiceInstanceOnTransactionComplete = false)]
ReleaseServiceInstanceOnTransactionComplete = false是為了使用易失型資料總管
MSMQ會話型隊列服務
MSMQ的會話狀态可不是之前那樣,而是一種會話圖的方式互動。
要注意SessionMode比為Required,是因為調用一個會話型隊列終結點的代理時,在用戶端就必須要有一個環境事務的前提,是以才如此配置。
在會話型事務隊列中我們還要注意,釋放資源的順序,先是事務範圍對象,再是代理對象,否則會導緻事務提前結束,那樣我們的資訊就不會被放入到隊列中去
一個會話型隊列服務還要被配置為所有操作中使用事務也就是TransactionScopeRequired = true,如果無法做到那麼所有事務都将復原,并且除了最後一個方法之外的所有方法隻能為TransactionAutoComplete=false。這也是。net 3.5上存在的漏洞,4.0中已更正(實驗證明)
MSMQ并發,與并發限流類型,略過
MSMQ傳輸故障:逾時與過期,安全性不比對,事務不比對,事務不比對,網絡問題,機器崩潰,清除,超出配額
DLQ的處理(Deat-Letter Queue)
由于上述的傳輸故障原因産生,導緻了死信隊列的出現
死信隊列處理方案 timeToLive
DLQ服務的使用
1.配置DLQ模式為Custom
2.例外配置DLQ節點實作對目前服務的調用
3.利用操作上下擷取DLQ發生的原因,重要屬性 MoveCount,DeliveryStatus,DeliveryFailure
有害消息
消息系統在處理不斷回放失敗或ACK,NACK的消息時會降低系統的性能,對于這樣的情況我們稱之為有害消息。
處理方案:
1.ReceiveRetryCount 重試次數
2.MaxRetryCycles 最大循環批次
3.RetryCycleDelay 批次間重試時間間隔
4.ReceiveErrorHanding 最後一次失敗處理 Fault保守處理,Drop丢棄,Reject主動拒絕,Move轉交第三方處理。
HTTP橋的使用(MSMQ穿越好戲)
1 契約
[ServiceContract]
public interface IMyContract
{
[OperationContract(IsOneWay = true)]
void MyMethod();
}
public interface IMyContractHttpBridge
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
2.服務
public class MyService : IMyContract
// MSMQ傳入
[OperationBehavior(TransactionScopeRequired=true)]
public void MyMethod()
{
throw new NotImplementedException();
}
public class MyServiceHttpBridge : IMyContractHttpBridge
// HTTP傳入
public void MyMethod()
MyContractClient proxy = new MyContractClient();
// MSMQ傳出
proxy.MyMethod();
proxy.Close();
3.配置檔案
<system.serviceModel>
<services>
<service name="Hosting.MyService">
<endpoint address="net.msmq://localhost/private/MyServiceQueue" binding="netMsmqBinding" contract="Hosting.IMyContract"></endpoint>
</service>
</services>
<service name="Hosting.MyServiceHttpBridge">
<endpoint address="http://localhost/MyServiceHttpBridge" binding="wsHttpBinding" contract="Hosting.IMyContractHttpBridge" bindingConfiguration="ReliableTransactedHTTP"></endpoint>
<bindings>
<wsHttpBinding>
<binding name="ReliableTransactedHTTP" transactionFlow="true">
<reliableSession enabled="true" />
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="net.msmq://localhost/private/MyServiceQueue" binding="netMsmqBinding" contract="Hosting.IMyContract"></endpoint>
</client>
</system.serviceModel>
4.用戶端實作
MyContractClient proxy = new MyContractClient();
class MyClientHttpBridge : IMyContract
MyContractHttpBridgeClient proxy = new MyContractHttpBridgeClient();
// HTTP傳出
本文轉自My_King1 51CTO部落格,原文連結:http://blog.51cto.com/apprentice/1360554,如需轉載請自行聯系原作者