• 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 }
  • 相关阅读:
    Vue项目中使用Vue-Quill-Editor富文本编辑器插件
    Element-UI中的Cascader 级联选择器高度以及位置问题
    Sublime中同一个文件进行分屏显示
    Oracle的clob数据类型
    查看Nginx版本号的几种方式
    华为路由器EasyNAT&NAT Server
    huawei路由器NAT配置
    15
    14
    13
  • 原文地址:https://www.cnblogs.com/malcolmfeng/p/8085550.html
Copyright © 2020-2023  润新知