RabbitMq向同一个消费者发送两次消息

时间:2016-04-13 16:01:57

标签: c# rabbitmq

我已在我的应用程序中实现了rabbitmq消息传递。这是一种非常奇怪的行为。

我的发布商是一个网络服务,而我的消费者是一个控制台应用程序。收到消息后,我立刻回答它并跨越一个新线程进行处理,花费2秒钟完成。

但是发送相同的消息,前一个传递标记加1。我正在使用基于主题的路由。

我会做错什么?

订户:

//Create the connection factory
var connectionFactory = new ConnectionFactory()
{
    HostName = host,
    UserName = userName,
    Password = password
};


connectionFactory.RequestedHeartbeat = 10;
connectionFactory.RequestedConnectionTimeout = 30000;
connectionFactory.AutomaticRecoveryEnabled = true;
connectionFactory.NetworkRecoveryInterval = TimeSpan.FromSeconds(10);


//connection
var connection = connectionFactory.CreateConnection();

logger.Info($"Connected to RabbitMQ {host}");
connection.ConnectionShutdown += Connection_ConnectionShutdown;

var model = connection.CreateModel();

model.BasicQos(0, 1, false);

var consumer = new QueueingBasicConsumer(model);

model.BasicConsume(queueName, false, consumer);

while (true)
{
    try
    {
        var deliveryArgs = consumer.Queue.Dequeue();

        model.BasicAck(deliveryArgs.DeliveryTag, false);

        var jsonString = Encoding.Default.GetString(deliveryArgs.Body);
        var itemtoprocess = jsonString.FromJson < recieved message > ();

        if (deliveryArgs.Redelivered)
        {

            model.BasicReject(deliveryArgs.DeliveryTag, false);
        }
        else
        {

            var task = Task.Factory.StartNew(() => {
                //Do work here on different thread then this one
                //Call the churner to process the message
                //Some long running method here to process item recieve
            });

            Task.WaitAll(task);


        }
    }
    catch (EndOfStreamException ex)
    {
        //log
    }
}

设定:

public void Init(string exchangeName, string queueName, string routingKey = "")
{
    using (IConnection connection = connectionFactory.CreateConnection())
    {
        using (IModel channel = connection.CreateModel())
        {

            channel.ExchangeDeclare(exchangeName, ExchangeType.Topic, true, false, null);

            //Queue
            var queue = channel.QueueDeclare(queueName, true, false, false, null);

            channel.QueueBind(queue.QueueName, exchangeName, routingKey);
        }
    }
}

0 个答案:

没有答案