【.NET】MSMQ Receive 時發生 MessageQueueException:交易作業順序無效

  • 8833
  • 0

  按照 MSDN 上範例使用交易式訊息佇列,在本機訊息佇列上傳送與接收都可以正常運作。

  但是當使用遠端伺服器訊息佇列時,接收卻會發生例外:交易作業順序無效

01:Receive_MessageQueueException_TransactionSequence

  求助 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 開啟,防火牆關閉,但是仍然無法接收。

不知道該如何才能正常運作。如果有善心人士可以給點方向或範例,我會非常感激~

5、目前作法

  目前專案設計相對簡單,每一次訊息都是獨立的邏輯,所以可以採用非交易式訊息佇列來處理傳送與接收。

  但是專案使用了 cluster 架構的 MSMQ,希望在 failover 的時候,訊息能夠轉移到另一台節點主機。

測試在 cluster 轉移 MSMQ 服務節點主機,交易式訊息佇列上的訊息主體會一併轉移到另一台節點主機,非交易式訊息佇列上的訊息主體會消失。

  綜合以上原因,目前專案作法為:使用交易式訊息佇列,每次只傳送或接收一個訊息主體,接收時使用非交易式的 Receive 接收訊息。

嘗試將自己的理解寫成文字紀錄,資料來源均來自於網路。

如有理解錯誤、引用錯誤或侵權,請多加指正與告知,讓我有更多的進步與改進的空間,謝謝!