Tôi có điều này trong một lớp có tên là "MessageQueueReceive".MSMQ nhận được với giao dịch - rollback không làm cho thông báo có sẵn trở lại
public MessageQueueTransaction BlockingReceive(out Message message)
{
MessageQueueTransaction tran = null;
message = null;
tran = new MessageQueueTransaction();
tran.Begin();
try
{
message = Queue.Receive(new TimeSpan(0, 0, 5), tran);
}
catch (MessageQueueException ex)
{
// If the exception was a timeout, then just continue
// otherwise re-raise it.
if (ex.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout)
throw ex;
}
return tran;
}
Sau đó, vòng lặp xử lý của tôi có này: -
while (!Abort)
{
try
{
tran = this.Queue.BlockingReceive(out msg);
if (msg != null)
{
// Process message here
if (tran != null)
tran.Commit();
}
}
catch (Exception ex)
{
if (tran != null)
tran.Abort();
}
}
Việc kiểm soát công cụ bảng cho thấy hàng đợi thông điệp mà tôi đang sử dụng là giao dịch. Hàng đợi tạp chí không được bật.
Mã này tạo ra hàng đợi: -
private static MessageQueue CreateMessageQueue(string queueName, bool transactional = false)
{
MessageQueue messageQueue = MessageQueue.Create(queueName, transactional);
messageQueue.SetPermissions("Administrators", MessageQueueAccessRights.FullControl,
AccessControlEntryType.Allow);
return messageQueue;
}
Tham số giao dịch được thiết lập là "true" khi điều này được gọi.
Điều tôi thấy là khi ngoại lệ xảy ra trong quá trình xử lý thư, tran.Abort được gọi nhưng tại thời điểm đó, tôi muốn thư được trả về hàng đợi. Tuy nhiên, điều này không xảy ra và các tin nhắn bị mất.
Tôi có thiếu thứ gì đó hiển nhiên không? Ai có thể nhìn thấy những gì tôi đang làm sai?
Hàng đợi bạn đang nhận trên máy cục bộ với dịch vụ người nghe phải không? –
Có, quá trình gửi và nhận và hàng đợi là tất cả trên cùng một hộp. Chúng là hàng đợi riêng tư. Tôi cũng có cùng mã chạy trên một vài hộp khác nhau và thấy cùng một vấn đề.Điều đó cho thấy nó liên quan đến mã này chứ không phải là một cái gì đó kỳ quặc về máy. – JohnCC
Câu hỏi rõ ràng tôi đoán. Bạn có chắc chắn nó đang nhấn ngoại lệ với việc hủy bỏ trong? Có thể là một ngoại lệ được ném trong mã xử lý tin nhắn của bạn bị bắt và sau đó bị vứt đi để nó không bao giờ bong bóng cho bạn xử lý ngoại lệ với việc hủy bỏ trong đó? –