2011-04-26 21 views
2

我第一次玩RabbitMQ的.NET API,我想出了一個似乎對我來說似乎合理的用例:我想創建發佈者發佈消息並在他們完成Ack-ed後執行某些操作。在IModel.BasicAcks事件似乎是一個體面的方式來了解這一點,so--如何讓IModel.BasicAcks啓動?

我寫了一個出版商:

 private static void Post(string message) { 

      model.ExchangeDeclare("MyExchange", ExchangeType.Fanout, true); 
      model.QueueDeclare("MyQueue", true, false, false, null); 
      model.QueueBind("MyQueue", "MyExchange", "", new Dictionary<string, object>()); 

      byte[] messageBodyBytes = System.Text.UTF8Encoding.ASCII.GetBytes(message); 
      IBasicProperties props = model.CreateBasicProperties(); 
      props.ContentType = "text/plain"; 
      props.DeliveryMode = 2; 
      model.BasicPublish("MyExchange", "", props, messageBodyBytes); 
    } 

和用戶:

private static void Receive() { 
      var gotten = model.BasicGet("MyQueue", false); 
      var text = System.Text.UTF8Encoding.ASCII.GetString(gotten.Body); 
      Console.WriteLine(text); 
      model.BasicAck(gotten.DeliveryTag, false); 
    } 

這是控制檯應用程序的入口點:

 static void Main(string[] args) { 

     connectionFactory = new ConnectionFactory(); 
     connectionFactory.HostName = "localhost"; 
     connection = connectionFactory.CreateConnection(); 
     model = connection.CreateModel(); 
     model.BasicAcks += new RabbitMQ.Client.Events.BasicAckEventHandler(model_BasicAcks); 
     Post("Hello, World!"); 
     Receive(); 
     Console.ReadKey(); 

     connection.Dispose(); 
     model.Dispose(); 

    } 

出於某種原因,我的事件處理程序未被調用。 「你好,世界!」消息被髮布,讀取,Ack和打印到控制檯,但由於某種原因,事件處理程序從不被調用。

我做錯了什麼?訂閱IModel.ModelShutdown似乎工作得很好。

回答

0

與API嘗試了很多之後,這裏是什麼工作爲了我。我需要在聲明我的交換和隊列之前聲明我的事件處理程序。

_rabbitMqChannel.BasicAcks += new BasicAckEventHandler(_rabbitMqChannel_BasicAcks); 
_rabbitMqChannel.BasicNacks += new BasicNackEventHandler(_rabbitMqChannel_BasicNacks); 

_rabbitMqChannel.ExchangeDeclare(ExchangeName, ExchangeTypeVal.ToString()); 
_rabbitMqChannel.QueueDeclare(QueueName, QueueDurable, QueueExclusive, QueueDelete, null); 
_rabbitMqChannel.QueueBind(QueueName, ExchangeName, RoutingKey); 

,這裏是事件處理方法將如何看起來像......

private void _rabbitMqChannel_BasicNacks(IModel model, BasicNackEventArgs args) 
{ 
    throw new NotImplementedException(); 
} 

private void _rabbitMqChannel_BasicAcks(IModel model, BasicAckEventArgs args) 
{ 
    throw new NotImplementedException(); 
} 

半天花在這個!希望這有助於某人;)

+0

這給了我錯誤: 無法找到類型或命名空間名稱'BasicAckEventHandler'(您是否缺少using指令或程序集引用?) – 2016-09-28 10:52:53

+0

我正在使用rabbitmq-dotnet- client-3.6.5-dotnet-4.5 它可能是他們在最近的版本中把它關掉了嗎? 你能否提供你的版本號? 我需要這個爲我工作請。 – 2016-09-28 11:58:59

+0

我已經提出了一個新的查詢,所以,你可以協助回答 http://stackoverflow.com/questions/39747226/the-type-or-namespace-name-basicackeventhandler-could-not-be-found-are - 你-MI – 2016-09-28 12:30:07