2017-03-03 7 views
1

enter image description here私の質問は簡単です。私は、asp.net webapiを使用してメッセージキューを作成するためにrabbitmqを使用したいと思います。一方、GetAllQueuesはメッセージを返しません。メッセージは常にnullです。コンソールアプリケーションが、メッセージで完璧なコードの下には、常に私はポストの下にヌル実行すると:私はrabbitMqをasp.net Webapiからメッセージを取得する方法を教えてください。

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を与えることができますか "クレジットはあなたのアプリで消費者の1つだけのインスタンス" – Prageeth

関連する問題