天天用心去作,用行動去改變一些人的觀念,或許是他們的態度,或許是他們的意識.
這樣對我來講都是對這個世界的點點改變,我也對此樂此不疲
今天再次深刻了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(); } [ServiceContract] public interface IMyContractHttpBridge { [OperationContract] [TransactionFlow(TransactionFlowOption.Mandatory)] void MyMethod(); } 2.服務 public class MyService : IMyContract { // MSMQ傳入 [OperationBehavior(TransactionScopeRequired=true)] public void MyMethod() { throw new NotImplementedException(); } } public class MyServiceHttpBridge : IMyContractHttpBridge { // HTTP傳入 [OperationBehavior(TransactionScopeRequired=true)] 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> <services> <service name="Hosting.MyServiceHttpBridge"> <endpoint address="http://localhost/MyServiceHttpBridge" binding="wsHttpBinding" contract="Hosting.IMyContractHttpBridge" bindingConfiguration="ReliableTransactedHTTP"></endpoint> </service> </services> <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(); // MSMQ傳出 proxy.MyMethod(); proxy.Close(); class MyClientHttpBridge : IMyContract { [OperationBehavior(TransactionScopeRequired=true)] public void MyMethod() { MyContractHttpBridgeClient proxy = new MyContractHttpBridgeClient(); // HTTP傳出 proxy.MyMethod(); proxy.Close(); } }