<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      rabbitmq實現延時隊列(死信隊列)

      基于隊列和基于消息的TTL

      TTL是time to live 的簡稱,顧名思義指的是消息的存活時間。rabbitMq可以從兩種維度設置消息過期時間,分別是隊列和消息本身。
      隊列消息過期時間-Per-Queue Message TTL:
      通過設置隊列的x-message-ttl參數來設置指定隊列上消息的存活時間,其值是一個非負整數,單位為微秒。不同隊列的過期時間互相之間沒有影響,即使是對于同一條消息。隊列中的消息存在隊列中的時間超過過期時間則成為死信。

      死信交換機DLX

      隊列中的消息在以下三種情況下會變成死信
      (1)消息被拒絕(basic.reject 或者 basic.nack),并且requeue=false;
      (2)消息的過期時間到期了;
      (3)隊列長度限制超過了。
      當隊列中的消息成為死信以后,如果隊列設置了DLX那么消息會被發送到DLX。通過x-dead-letter-exchange設置DLX,通過這個x-dead-letter-routing-key設置消息發送到DLX所用的routing-key,如果不設置默認使用消息本身的routing-key.

       @Bean
        public Queue lindQueue() {
          return QueueBuilder.durable(LIND_QUEUE)
              .withArgument("x-dead-letter-exchange", LIND_DL_EXCHANGE)//設置死信交換機
              .withArgument("x-message-ttl", makeCallExpire)
              .withArgument("x-dead-letter-routing-key", LIND_DEAD_QUEUE)//設置死信routingKey
              .build();
        }
      

      實現的過程

      graph TD publisher-->正常queue 正常queue-->TTL TTL-->dead.queue dead.queue-->subscriber

      完整的代碼

      @Component
      public class AmqpConfig {
        /**
         * 主要測試一個死信隊列,功能主要實現延時消費,原理是先把消息發到正常隊列,
         * 正常隊列有超時時間,當達到時間后自動發到死信隊列,然后由消費者去消費死信隊列里的消息.
         */
        public static final String LIND_EXCHANGE = "lind.exchange";
        public static final String LIND_DL_EXCHANGE = "lind.dl.exchange";
        public static final String LIND_QUEUE = "lind.queue";
        public static final String LIND_DEAD_QUEUE = "lind.queue.dead";
      
        public static final String LIND_FANOUT_EXCHANGE = "lindFanoutExchange";
        /**
         * 單位為微秒.
         */
        @Value("${tq.makecall.expire:60000}")
        private long makeCallExpire;
      
        /**
         * 創建普通交換機.
         */
        @Bean
        public TopicExchange lindExchange() {
          return (TopicExchange) ExchangeBuilder.topicExchange(LIND_EXCHANGE).durable(true)
              .build();
        }
      
        /**
         * 創建死信交換機.
         */
        @Bean
        public TopicExchange lindExchangeDl() {
          return (TopicExchange) ExchangeBuilder.topicExchange(LIND_DL_EXCHANGE).durable(true)
              .build();
        }
      
        /**
         * 創建普通隊列.
         */
        @Bean
        public Queue lindQueue() {
          return QueueBuilder.durable(LIND_QUEUE)
              .withArgument("x-dead-letter-exchange", LIND_DL_EXCHANGE)//設置死信交換機
              .withArgument("x-message-ttl", makeCallExpire)
              .withArgument("x-dead-letter-routing-key", LIND_DEAD_QUEUE)//設置死信routingKey
              .build();
        }
      
        /**
         * 創建死信隊列.
         */
        @Bean
        public Queue lindDelayQueue() {
          return QueueBuilder.durable(LIND_DEAD_QUEUE).build();
        }
      
        /**
         * 綁定死信隊列.
         */
        @Bean
        public Binding bindDeadBuilders() {
          return BindingBuilder.bind(lindDelayQueue())
              .to(lindExchangeDl())
              .with(LIND_DEAD_QUEUE);
        }
      
        /**
         * 綁定普通隊列.
         *
         * @return
         */
        @Bean
        public Binding bindBuilders() {
          return BindingBuilder.bind(lindQueue())
              .to(lindExchange())
              .with(LIND_QUEUE);
        }
      
        /**
         * 廣播交換機.
         *
         * @return
         */
        @Bean
        public FanoutExchange fanoutExchange() {
          return new FanoutExchange(LIND_FANOUT_EXCHANGE);
        }
      }
      
      
      //-----------------
      
      @Component
      public class Publisher {
        @Autowired
        private RabbitTemplate rabbitTemplate;
      
      
        public void publish(String message) {
          try {
            rabbitTemplate
                .convertAndSend(AmqpConfig.LIND_EXCHANGE, AmqpConfig.LIND_DELAY_QUEUE,
                    message);
          } catch (Exception e) {
            e.printStackTrace();
          }
        }
      }
      
      //-----------------
      
      @Component
      @Slf4j
      public class Subscriber {
        @RabbitListener(queues = AmqpConfig.LIND_QUEUE)
        public void customerSign(String data) {
          try {
      
            log.info("從隊列拿到數據 :{}", data);
      
          } catch (Exception ex) {
                e.printStackTrace();
          }
        }
      }
      
      
      posted @ 2018-11-19 19:06  張占嶺  閱讀(9794)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 久热这里只有精品在线观看| 性色av 一区二区三区| 日本道高清一区二区三区| 东方四虎av在线观看| 久久精品噜噜噜成人av| 香蕉久久夜色精品国产成人| 99在线视频免费观看| 悠悠人体艺术视频在线播放| 久久高潮少妇视频免费| 国产亚洲无线码一区二区| 亚洲成在人线在线播放无码| 日韩激情一区二区三区| 久久精品国产久精国产| 亚洲国产综合av在线观看| 91麻豆精品国产91久| 国产视频精品一区 日本| 婷婷五月综合丁香在线| 国产成人无码一区二区三区| 中国美女a级毛片| 国产午夜精品久久久久免费视| 日本55丰满熟妇厨房伦| 国产视频一区二区在线看| 日本一区二区中文字幕久久| 人妻一区二区三区三区| 放荡的少妇2欧美版| 一本大道久久香蕉成人网| 老司机午夜福利视频| 无码成a毛片免费| 精品国产大片中文字幕| 亚洲成在人线AⅤ中文字幕| av午夜福利一片看久久| 亚洲高清成人av在线| 少妇人妻偷人免费观看| 丁香婷婷综合激情五月色 | 日韩av无码精品人妻系列| 欧美日韩国产码高清| 林甸县| 日本一区二区三区在线播放| 国产成人影院一区二区三区| 婷婷五月综合激情| 中文字幕av无码一区二区三区|