【RabbitMQ】RabbitMQ的公平转发和持久化

问题:公平转发

 

         目前消息转发机制是平均分配,这样就会出现俩个消费者,奇数的任务很耗时,偶数的任何工作量很小,造成的原因就是近当消息到达队列进行转发消息。并不在乎有多少任务消费者并未传递一个应答给RabbitMQ。仅仅盲目转发所有的奇数给一个消费者,偶数给另一个消费者。

         为了解决这样的问题,我们可以使用basicQos方法,传递参数为prefetchCount= 1。这样告诉RabbitMQ不要在同一时间给一个消费者超过一条消息。

         换句话说,只有在消费者空闲的时候会发送下一条信息。

调度分发消息的方式,也就是告诉RabbitMQ每次只给消费者处理一条消息,也就是等待消费者处理完毕并自己对刚刚处理的消息进行确认之后,才发送下一条消息,防止消费者太过于忙碌,也防止它太过去清闲。

intprefetchCount = 1;  

 channel.basicQos(prefetchCount);



问题:持久化:


          消息持久化在消息声明和通道发布的时候来声明他为持久化,同时在消费端声明的时候也需要声明为持久化。

          没有持久化,重新启动RabbitMQ,发现没有了。

          持久化之后,重新启动RabbitMQ,发现是有的,执行消费者,可以获取该消息。

  1. package cn.itcast.rabbitmq.durable;  
  1.   
  1. import com.rabbitmq.client.ConnectionFactory;  
  2. import com.rabbitmq.client.Connection;  
  3. import com.rabbitmq.client.Channel;  
  4. import com.rabbitmq.client.QueueingConsumer;  
  1.   
  1. public class ClientReceive1  
  1. {  
  2.     public static final String queue_name = "my_queue";  
  3.     public static final boolean autoAck = false;  
  4.     public static final boolean durable = true;  
  5.   
  6.     public static void main(String[] args) throws java.io.IOException,  
  7.         java.lang.InterruptedException  
  8.     {  
  9.         ConnectionFactory factory = new ConnectionFactory();  
  10.         factory.setHost("localhost");  
  11.         factory.setPort(5672);  
  12.         // 设置账号信息,用户名、密码、vhost  
  13.         factory.setVirtualHost("/taotao");  
  14.   
  15.     factory.setUsername("taotao");  
  16.     factory.setPassword("taotao");  
  17.     Connection connection = factory.newConnection();  
  18.     Channel channel = connection.createChannel();  
  19.     channel.queueDeclare(queue_name, durable, falsefalsenull);  
  20.     System.out.println("Wait for message");  
  21.     channel.basicQos(1); // 消息分发处理  
  22.     QueueingConsumer consumer = new QueueingConsumer(channel);  
  23.     channel.basicConsume(queue_name, autoAck, consumer);  
  24.     while (true)  
  25.     {  
  26.         Thread.sleep(500);  
  27.         QueueingConsumer.Delivery deliver = consumer.nextDelivery();  
  28.         String message = new String(deliver.getBody());  
  29.         System.out.println("Message received:" + message);  
  30.         channel.basicAck(deliver.getEnvelope().getDeliveryTag(), false);  
  31.     }  
  32.     }  
  33. } 
  34.  

 



代码是 从world中粘贴过来的,格式有点不好,请谅解!

你可能感兴趣的:(#,MQ,开源)