2009-04-08 29 views
5

Có thể đảm bảo giao hàng theo yêu cầu khi sử dụng WCF netMSMQbinding không?Giao hàng đặt hàng với netMSMQbinding

Chúng tôi đang đặt lệnh chèn theo sau là một số lệnh cập nhật trên cùng một hàng đợi và thỉnh thoảng một trong các bản cập nhật sẽ đánh bại chèn.

Đã thêm ghi nhật ký mở rộng, rõ ràng là chúng đang được thêm vào hàng đợi theo đúng thứ tự và được xử lý theo thứ tự khác.

Tôi đã quản lý Google một vài bài viết cho biết rằng hành vi này được mong đợi, nhưng có vẻ như nó phải có khả năng cấu hình nó để được sắp xếp theo cách nào đó.

hàng đợi của chúng tôi là giao dịch, vì vậy tôi không nghĩ rằng việc thêm số thứ tự và resequencing tại điểm đến là đi làm việc, vì đó sẽ bị thua thiệt transactionality

Nếu tôi thêm các thuộc tính [DeliveryRequirements(RequireOrderedDelivery=true, QueuedDeliveryRequirements=QueuedDeliveryRequirementsMode.Require)] tôi nhận được lỗi sau :

The DeliveryRequirementsAttribute on contract 'IService' specifies a QueuedDeliveryRequirements value of NotAllowed. However, the configured binding for this contract specifies that it does support queued delivery. A queued binding may not be used with this contract.

Tôi không biết tại sao chúng tôi gặp lỗi này vì mọi thứ "xuất hiện" sẽ được thiết lập chính xác. Tôi đã không quản lý để tìm bất kỳ xác nhận rằng thiết lập này được cho phép cho MSMQ mặc dù, vì nó dường như là một thiết lập WS-RM, và AFAIK netMSMQBinding không hỗ trợ WS-RM.

+0

tôi nộp một lỗi kết nối về chủ đề này, không hẳn là vấn đề tương tự như bạn đã có, nhưng đủ gần ... Tôi cũng có một giải pháp trong lỗi kết nối. Hãy xem tại đây: https://connect.microsoft.com/VisualStudio/feedback/details/1107645/wcf-receives-messages-from-msmq-out-of-order –

Trả lời

3

MSMQ không hỗ trợ phân phối theo thứ tự, do đó bạn không thể.

Hãy xem System.ServiceModel.Channels.MsmqBindingElementBase + BindingDeliveryCapabilitiesHelper đó là lớp xác định khả năng ràng buộc MSMQ, và làm thế nào nó thực hiện rằng bất động sản:

bool IBindingDeliveryCapabilities.AssuresOrderedDelivery 
{ 
    get 
    { 
     return false; 
    } 
} 
+0

Hoàn hảo. Chỉ là câu trả lời rõ ràng mà tôi đang tìm kiếm. Bây giờ tôi có thể quay trở lại công việc ban ngày :) – Modan

1

Hình như bạn có thể thông báo nhóm, vì thế bạn có thể chỉ định thứ tự trong hợp đồng. Kiểm tra số này MSDN article on grouping messages.

2

This post from Simon Gittins vẻ như nó gợi ý rằng giao ra lệnh có thể:

As it turns out, there's an undocumented feature that deals with this situation:

  • Apply a TransactedBatchingBehavior with a batch size of ONE to the service endpoint.
  • ReleaseServiceInstanceOnTransactionComplete must be set to true on the service implementation.

Once these two things are done, my test program no longer produces out of order messages.

+0

Thực ra, 'ReleaseServiceInstanceOnTransactionComplete' phải được đặt thành' false' (như đã nói trong bài viết cuối cùng của [cùng một luồng] (http://social.msdn.microsoft.com)/diễn đàn/vi-us/wcf/thread/D5E62C68-08FA-492C-BA05-182EC313A54B)). Đặt nó thành true sẽ gây ra một ngoại lệ kích hoạt trong thời gian chạy. Nếu không, điều này dường như sửa chữa thứ tự. – htuomola

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