RabbitMQ之消费者Demo(队列参数详细说明)

  1 package com.jiefupay;
  2 
  3 import java.io.IOException;
  4 import java.util.HashMap;
  5 import java.util.Map;  8 
  6 import org.apache.log4j.Logger;
  7 
  8 import com.jiefupay.dao.Dao;
  9 
 10 import com.rabbitmq.client.AMQP;
 11 import com.rabbitmq.client.Channel;
 12 import com.rabbitmq.client.Connection;
 13 import com.rabbitmq.client.ConnectionFactory;
 14 import com.rabbitmq.client.Consumer;
 15 import com.rabbitmq.client.DefaultConsumer;
 16 import com.rabbitmq.client.Envelope;
 17 
 18 public class App{
 19 
 20     private static final Logger log = Logger.getLogger(App.class); 26     
 21     private static final String EXCHANGE_NAME = "refreshDispatcherMemoryExchange";
 22     
 23     private static String QUEUE_NAME = "refreshDispatcherMemoryhfQueue";
 24 
 25     public static void main(String[] args) throws Exception {
 26         
 27         ConnectionFactory factory = new ConnectionFactory();
 28         factory.setHost("127.0.0.1");
 29         factory.setPort(5672);
 30         factory.setUsername("yourusername");
 31         factory.setPassword("yourpassword");
 32         
 33         //0.创建连接和通道
 34         Connection connection = factory.newConnection();
 35         Channel channel = connection.createChannel();
 36         
 37         //1.声明一个死信交换机(扇形交换机)
 38         channel.exchangeDeclare("refreshDispatcherDeadExchange", "fanout");
 39 
 40         //2.创建队列的参数
 41         Map<String, Object> queueArgs = new HashMap<String, Object>();
 42         queueArgs.put("x-dead-letter-exchange", "refreshDispatcherDeadExchange");  //死信队列
 43         queueArgs.put("x-message-ttl", 10000);     // 消息超时:让发布的message在队列中可以存活多长时间,以毫秒为单位。
 44         queueArgs.put("x-expires", 1000);          // 队列超时:当前的queue在指定的时间内,没有消费者订阅就会被删除,以毫秒为单位。
 45         queueArgs.put("x-max-length", 100);        // 队列最大长度:当超过了这个大小的时候,会删除之前最早插入的消息为本次的留出空间。
 46         queueArgs.put("x-queue-mode", "lazy");     //延迟加载:queue的信息尽可能的都保存在磁盘上,仅在有消费者订阅的时候才会加载到RAM中。
 47         
 48         //3.声明队列。-将队列参数传到队列 (队列名字,是否持久化,是否排外,是否自动清理,参数)
 49         channel.queueDeclare(QUEUE_NAME, true, false, false, queueArgs);
 50         
 51         //4.队列绑定交换机。   绑定键的意义依赖于转发器的类型,对于fanout类型,忽略此参数(第三个参数为binding key)。
 52         channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
 53         
 54         Consumer consumer = new DefaultConsumer(channel) {
 55             @Override
 56             public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
 57                     byte[] body) throws IOException {
 58                 // 捕获消息内容
 59                 String message = new String(body, "UTF-8");
 60                 
 61                 try {
 62                     //消息处理(自己实现的方法)
 63                     messageHandler(message);
 64                     
 65                     //消息确认
 66                     channel.basicAck(envelope.getDeliveryTag(), false);
 67                     
 68                 }catch (Exception e) {
 69                     
 70                     //出现异常,置为true,重新入队。
 71                     channel.basicAck(envelope.getDeliveryTag(), true);
 72                     
 73                     //出现异常,不重新入队,而是reject入死信队列。
 74                     //channel.basicReject(envelope.getDeliveryTag(), false);
 75                     
 76                 }
 77             }
 78         };
 79         //第二个参数值为false代表关闭RabbitMQ的自动应答机制,改为手动应答。
 80         channel.basicConsume(QUEUE_NAME, false, consumer);
 81     }
 82     
 83     public static void messageHandler(String message) {
 84         switch (message) {
 85         case "loadQDProductData":   // 渠道信息  渠道产品
 86             Dao.loadQDProductDataToSystem();
 87             break;
 88         case "loadQDGroupData":  //渠道组
 89             Dao.loadQDGroupDataToSystem();
 90             break;
 91         case "loadCustomerData": // 客户信息
 92             Dao.loadCustomerDataToSystem();
 93             break;
 94         case "loadUserProductData": // 客户产品
 95             Dao.loadUserProductDataToSystem();
 96             break;
 97         default:
 98             break;
 99         }
100         log.info( message + " Done" );
101         
102     }
103 }

 

posted @ 2017-12-22 13:20  MalcolmFeng  阅读(7936)  评论(0编辑  收藏  举报