2014-04-10 22 views
5

tôi gửi một thông điệp tới một hàng đợi tin qua C#:MSMQ qua C# - ACK nhận được tin nhắn đó?

MessageQueue msgQ = new MessageQueue(@".\private$\aaa"); 
msgQ.Formatter = new XmlMessageFormatter(new[] { typeof (String) }); 
msgQ.Send(msg); 

Nó không làm việc và tôi thấy thông báo trong hàng đợi.

Tuy nhiên, có cách nào để nhận ACK cho dù thông báo có được vào hàng đợi với thành công không?

nb

BeginPeekPeekCompleted là một sự kiện mà được nâng lên khi một tin nhắn trở nên có sẵn trong hàng đợi hoặc khi khoảng thời gian xác định thời gian đã hết hạn. nó là không phải giúp tôi vì tôi cần biết liệu thông báo mà tôi đã gửi đã được nhận bởi msmq chưa. BeginPeek cũng sẽ được nâng lên nếu có ai đó khác đã nhập thư vào hàng đợi. và điều cuối cùng tôi muốn là kiểm tra qua BeginPeek - thông điệp này đến từ ai.

Tôi có thể làm như thế nào?

NB2

Hoặc có lẽ tôi không cần phải lo lắng vì msgQ.Send(msg); sẽ nâng cao ngoại lệ nếu thông điệp không được chèn ....?

Trả lời

3

Tôi nghĩ rằng những gì bạn đang cố gắng làm không nên được xử lý trong mã. Khi bạn gửi tin nhắn, nó được đặt trong hàng đợi gửi đi. Có rất nhiều lý do tại sao nó sẽ không đến đích, chẳng hạn như một phân vùng mạng hoặc hàng đợi đích đang đầy. Nhưng điều này không quan trọng đối với ứng dụng của bạn - chừng nào nó liên quan, nó đã gửi tin nhắn, nó đã giao dịch, nó không nhận được lỗi. Đó là trách nhiệm của cơ sở hạ tầng cơ sở để thực hiện phần còn lại và cơ sở hạ tầng đó cần được theo dõi để đảm bảo không có vấn đề kỹ thuật.

Bây giờ điều gì thực sự quan trọng đối với đơn đăng ký của bạn là đảm bảo giao hàng. Tôi giả định từ kịch bản mà bạn mô tả rằng bạn cần hàng đợi giao dịch lâu bền để đảm bảo rằng thư không bị mất. Thông tin thêm về các tùy chọn có thể được đọc here

Ngoài ra, nếu bạn cần một số nhận dạng để hiển thị cho người dùng dưới dạng xác nhận, thực hành phổ biến là tạo mã đó trong mã gửi và đặt nó vào chính thư đó. Sau đó, mã xử lý sẽ sử dụng id để thực hiện công việc được yêu cầu.

+0

Máy tính iis và msmq của tôi là cùng một máy. Nếu vậy, Có một thông báo được lưu trữ trong hàng đợi gửi đi trước khi nó đi vào hàng đợi đến không? Ngoài ra, không có nhiều hơn 1 hoạt động để hoàn thành trong giao dịch ... Vậy tại sao bạn không nghĩ rằng hàng đợi giao dịch không được khuyến khích? –

+0

Vâng, như được chỉ trong liên kết trong câu trả lời của tôi, nếu dịch vụ xử lý hàng đợi gặp sự cố trong khi xử lý hàng đợi không giao dịch, thông báo hiện tại bị mất. Sử dụng không giao dịch nếu điều này là OK. Đối với câu hỏi khác, nếu tất cả các giao tiếp là địa phương, hàng đợi gửi đi không nên được sử dụng. –

1

Sử dụng hàng đợi giao dịch và tất cả các máy của bạn đăng ký giao dịch DTC có khả năng sẽ cung cấp những gì bạn đang tìm kiếm. Tuy nhiên, nó là một nỗi đau ở mông và DTC có tác dụng phụ - giống như tất cả các giao dịch được đăng ký với nhau, bao gồm cả giao dịch DB.

Có lẽ giải pháp tốt hơn là sử dụng khung như MassTransit hoặc NServiceBus và thực hiện yêu cầu phản hồi, cho phép người quay lại phản hồi bằng thông báo xác nhận thực tế không chỉ "điều này đã được gửi" mà còn "Tôi thừa nhận điều này" với các tùy chọn thời gian chờ.

+0

không, tôi không tìm kiếm điều này. im tìm mã để kiểm tra xem thư đã được chèn chính xác vào hàng đợi chưa. đó là tất cả. không có DB. –

+0

Vâng, hàng đợi giao dịch xác nhận mục nhập vào hàng đợi khi giao dịch bị đóng. Nhưng nếu hàng đợi là giao dịch, khi bạn đọc nó, đó cũng là trong một phạm vi giao dịch. Đó là nơi bạn có được DTC tham gia. – Travis

0

Như Oleksii đã giải thích về phân phối đáng tin cậy.

Tuy nhiên điều này có thể ảnh hưởng đến hiệu suất.

Những gì tôi có thể đề xuất là:

Tại sao không tạo máy chủ MSMQ trên máy đang gửi MSG đến hệ thống khác.

Những gì tôi đang nghĩ đến là

  1. Server 1 gửi MSMSQ đến Server 2
  2. Server 2 nhận thêm vào xếp hàng
  3. Server 2 quá trình xếp hàng/bắn mã của bạn vào đây để gửi một msg MSMQ đến Server 1
  4. server 1 nhận mSG (bất kỳ msg thành công với msgid)
  5. làm nhiệm vụ thêm bạn

Cách tiếp cận này có thể là một dặm thêm, nhưng sẽ giữ cho máy chủ của bạn không hoạt động Lag.

Các vấn đề liên quan