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

4 篇文章 0 订阅

问题:公平转发

 

         目前消息转发机制是平均分配,这样就会出现俩个消费者,奇数的任务很耗时,偶数的任何工作量很小,造成的原因就是近当消息到达队列进行转发消息。并不在乎有多少任务消费者并未传递一个应答给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中粘贴过来的,格式有点不好,请谅解!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值