2017-03-03 70 views
1

enter image description here我的問題很簡單。我想用rabbitmq通過使用asp.net webapi來製作消息隊列。另一方面,GetAllQueues不返回任何消息。消息始終爲空。下面的代碼完美的控制檯應用程序,但消息一直空當我運行後下:我怎樣才能從asp.net Webapi調用rabbitMq獲取消息?

http://localhost:53301/api/CustomerPipline/?queueName=test123

enter image description here


using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
using RabbitMQ.Client; 
using System.Text; 
using RabbitMQ.Client.Events; 
using System.Diagnostics; 
using RabbitMQ.Client.Exceptions; 

namespace Atom.Mqpipline.Controllers 
{ 
    public class CustomerPiplineController : ApiController 
    { 
     private static readonly string _queueName = "test123"; 


     [HttpPost] 
     public HttpResponseMessage AddQueue(int customerId) 
     { 

      var publisher = new Publisher(_queueName, "Hello RabbitMQ World!"); 
      var resp = Request.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject("OK")); 

      return resp; 
     } 
     [HttpGet] 
     public HttpResponseMessage GetAllQueues(string queueName) 
     { 
      var consumer = new Consumer(queueName); 
      var resp = Request.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(consumer.Message)); 
      return resp; 
     } 
    } 

} 

public class RabbitMQService 
{ 
    private readonly string _hostName = "localhost"; 

    public IConnection GetRabbitMQConnection() 
    { 
     ConnectionFactory connectionFactory = new ConnectionFactory() 
     { 
      HostName = _hostName 
     }; 

     return connectionFactory.CreateConnection(); 
    } 
} 
public class Publisher 
{ 
    private readonly RabbitMQService _rabbitMQService; 

    public Publisher(string queueName, string message) 
    { 
     _rabbitMQService = new RabbitMQService(); 

     using (var connection = _rabbitMQService.GetRabbitMQConnection()) 
     { 
      using (var channel = connection.CreateModel()) 
      { 
       channel.QueueDeclare(queueName, false, false, false, null); 
       channel.BasicPublish("", queueName, null, Encoding.UTF8.GetBytes(message)); 
      } 
     } 
    } 
} 

public class Consumer 
{ 
    private readonly RabbitMQService _rabbitMQService; 
    public string Message { get; set; } 
    public Consumer(string queueName) 
    { 

     _rabbitMQService = new RabbitMQService(); 

     using (var connection = _rabbitMQService.GetRabbitMQConnection()) 
     { 
      using (var channel = connection.CreateModel()) 
      { 
       var consumer = new EventingBasicConsumer(channel); 
       // Received event'i sürekli listen modunda olacaktır. 
       consumer.Received += (model, ea) => 
       { 
        var body = ea.Body; 
        var message = Encoding.UTF8.GetString(body); 
        Debug.WriteLine(message); 
        Message = message; 
       }; 

       channel.BasicConsume(queueName, true, consumer); 
      } 
     } 
    } 
} 


回答

2

你不能叫消費者。消費者操作在收到消息時運行,而不是在您致電時。

  • 您的應用創造消費者的只有一個實例..
  • 加入隊列中接收消息。或通過signlr將消息直接推送到客戶端。
+0

請問您是否可以請電話或給予真正的ipmlementation「克里特只有一個消費者的實例在您的應用程序」 – Prageeth