2011-11-04 28 views
7

Tôi đang cố gắng viết một dịch vụ wcf hoạt động trên liên kết thỏMQ. Tôi đã có thể tạo thành công máy chủ và máy khách và yêu cầu khách hàng gửi tin nhắn đến máy chủ thông qua hàng đợi. Tôi bối rối về 2 vấn đề.RabbitMQ với WCF và một hàng đợi liên tục

  1. Ngay khi dịch vụ được tắt, hàng đợi sẽ bị xóa. Có cách nào để cấu hình wcf và rabbitMQ để hàng đợi là liên tục? Bằng cách này tôi không phải lo lắng về việc mất dữ liệu nếu máy chủ của tôi bị treo.

  2. Tôi dường như không thể kiểm soát tên của hàng đợi. Khi tôi chạy rabbitmqctl.bat list_queues Tôi thấy hàng đợi được gọi là amq.gen-3IgZD30XvTEQWNRsezSUUA==. Có cách nào để kiểm soát tên của hàng đợi không?

Trả lời

9

Điều đó không thể thực hiện với các ràng buộc WCF. Xem this chuỗi danh sách gửi thư để biết chi tiết.

Về cơ bản, bạn không thể kiểm soát tên hàng đợi qua WCF, có nghĩa là bạn được giới hạn nặc danh hàng đợi (như cái bạn đang nhìn thấy), trong đó, đến lượt nó, có nghĩa là bạn chỉ có thể sử dụng phi dai dẳng hàng đợi.

Nếu bạn cần kiểm soát nhiều hơn so với được cung cấp bởi các ràng buộc WCF, bạn nên xem xét việc sử dụng máy khách .NET đầy đủ. Nó khá dễ sử dụng, và có một bó của tutorials để giúp bạn bắt đầu (chúng có trong Java, nhưng .NET API rất giống nhau).

+4

Cảm ơn. Đó là câu trả lời mà tôi đang tìm kiếm. Nó cơ bản làm cho nó vô nghĩa để thậm chí có một ràng buộc WCF cho rabbitMQ nếu nó không thể cung cấp cho bạn điều khiển này. –

5

Tôi đã gặp vấn đề tương tự như bạn đã làm và những gì tôi đã làm là chỉnh sửa mã nguồn của rabbitMQDotNetClient.

File: RabbitMQInputChannel.cs

public override void Open(TimeSpan timeout) 
    {    
     if (State != CommunicationState.Created && State != CommunicationState.Closed) 
      throw new InvalidOperationException(string.Format("Cannot open the channel from the {0} state.", base.State)); 

     OnOpening(); 
#if VERBOSE 
     DebugHelper.Start(); 
#endif 
     //Create a queue for messages destined to this service, bind it to the service URI routing key 
#if USE_DEFINED_QUEUE_NAMES 
     //here we create a queue that uses the name given in the service address in the wcf binding. 
     //if the address in the web.config is: soap.amq:///QueueName 
     //the name of the queue will be: QueueName 
     //LVV 
     string queue = m_model.QueueDeclare(base.LocalAddress.Uri.PathAndQuery, true, false, false, null); 
#else 
     string queue = m_model.QueueDeclare(); 
#endif 
     m_model.QueueBind(queue, Exchange, base.LocalAddress.Uri.PathAndQuery, null); 

     //Listen to the queue 
     m_messageQueue = new QueueingBasicConsumer(m_model); 
     m_model.BasicConsume(queue, false, m_messageQueue); 

#if VERBOSE 
     DebugHelper.Stop(" ## In.Channel.Open {{\n\tAddress={1}, \n\tTime={0}ms}}.", LocalAddress.Uri.PathAndQuery); 
#endif 
     OnOpened(); 
    } 

Compile với USE_DEFINED_QUEUE_NAMES cờ. Điều này sẽ tạo một tên hàng đợi với tên bạn đã cho trong tệp app.config hoặc web.config của bạn. Bạn luôn có thể thay đổi các tùy chọn hàng đợi trên QueueDeclare (...) nếu bạn muốn hàng đợi của bạn hoạt động khác với những thứ tôi đang tạo. Chúc mừng!

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