按照 MSDN 上範例使用交易式訊息佇列,在本機訊息佇列上傳送與接收都可以正常運作。
但是當使用遠端伺服器訊息佇列時,接收卻會發生例外:交易作業順序無效。
求助 google 大神,得到底下的幾種解決方式。
1、改用非交易式訊息佇列
確定是否需要使用交易式訊息佇列,如果沒有必要性,可以改用非交易式訊息佇列來傳送與接收。
2、使用非交易式 Receive
交易式訊息佇列可以用非交易式的 Receive 接收訊息。
public Student NonTransactionalReceive(TimeSpan timeout)
{
this.messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(Student), });
var message = this.messageQueue.Receive(timeout);
return (Student)message.Body;
}
3、使用 MessageQueueTransactionType
交易式訊息佇列除了使用 MessageQueueTransaction 外,也可以使用 MessageQueueTransactionType 指定交易型別。
public Student InternalReceive(TimeSpan timeout)
{
this.messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(Student), });
var message = this.messageQueue.Receive(timeout, MessageQueueTransactionType.Single);
return (Student)message.Body;
}
4、使用 MSDTC External Transaction
參考 Visual Basic Code Example: Sending a Message Using an MS DTC External Transaction,似乎使用 MSMQCoordinatedTransactionDispenser 加上開啟 MSDTC 服務設定就可以正常運作。
但是在實作時,我已經將網路 DTC 開啟,防火牆關閉,但是仍然無法接收。
但是在實作時,我已經將網路 DTC 開啟,防火牆關閉,但是仍然無法接收。
不知道該如何才能正常運作。如果有善心人士可以給點方向或範例,我會非常感激~
5、目前作法
目前專案設計相對簡單,每一次訊息都是獨立的邏輯,所以可以採用非交易式訊息佇列來處理傳送與接收。
但是專案使用了 cluster 架構的 MSMQ,希望在 failover 的時候,訊息能夠轉移到另一台節點主機。
測試在 cluster 轉移 MSMQ 服務節點主機,交易式訊息佇列上的訊息主體會一併轉移到另一台節點主機,非交易式訊息佇列上的訊息主體會消失。
綜合以上原因,目前專案作法為:使用交易式訊息佇列,每次只傳送或接收一個訊息主體,接收時使用非交易式的 Receive 接收訊息。
嘗試將自己的理解寫成文字紀錄,資料來源均來自於網路。
如有理解錯誤、引用錯誤或侵權,請多加指正與告知,讓我有更多的進步與改進的空間,謝謝!