<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Springboot整合RabbitMQ-設(shè)置消息過(guò)期時(shí)間TTL

          共 2850字,需瀏覽 6分鐘

           ·

          2021-03-14 18:19

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

            作者 |  砒霜拌辣椒

          來(lái)源 |  urlify.cn/3uiEzq

          主要有2種方式:

          1. 指定一條消息的過(guò)期時(shí)間。

          2. 給隊(duì)列設(shè)置消息過(guò)期時(shí)間,隊(duì)列中的所有消息都有同樣的過(guò)期時(shí)間。

          1、指定消息的過(guò)期時(shí)間

          @RestController
          public class TTLController {
              @Autowired
              private RabbitTemplate rabbitTemplate;

              @PostMapping("/testTTL")
              public String testTTL() {
                  MessageProperties messageProperties = new MessageProperties();
                  messageProperties.setExpiration("20000"); // 設(shè)置過(guò)期時(shí)間,單位:毫秒
                  byte[] msgBytes = "測(cè)試消息自動(dòng)過(guò)期".getBytes();
                  Message message = new Message(msgBytes, messageProperties);
                  rabbitTemplate.convertAndSend("TTL_EXCHANGE""TTL", message);
                  return "ok";
              }
          }

          消息推送到隊(duì)列后,如果指定時(shí)間內(nèi)沒(méi)有被消費(fèi),則會(huì)自動(dòng)過(guò)期。

          注意:
          RabbitMQ只會(huì)對(duì)隊(duì)列頭部的消息進(jìn)行過(guò)期淘汰。如果單獨(dú)給消息設(shè)置TTL,先入隊(duì)列的消息過(guò)期時(shí)間如果設(shè)置比較長(zhǎng),后入隊(duì)列的設(shè)置時(shí)間比較短。會(huì)造成消息不會(huì)及時(shí)地過(guò)期淘汰,導(dǎo)致消息的堆積。

          2、給隊(duì)列中的所有消息設(shè)置過(guò)期時(shí)間

          @Configuration
          public class TTLQueueRabbitConfig {
              @Bean
              public Queue TTLQueue() {
                  Map<String, Object> map = new HashMap<>();
                  map.put("x-message-ttl", 30000); // 隊(duì)列中的消息未被消費(fèi)則30秒后過(guò)期
                  return new Queue("TTL_QUEUE"truefalsefalse, map);
              }

              @Bean
              public DirectExchange TTLExchange() {
                  return new DirectExchange("TTL_EXCHANGE"truefalse);
              }

              @Bean
              public Binding bindingDirect() {
                  return BindingBuilder.bind(TTLQueue()).to(TTLExchange()).with("TTL");
              }
          }

          聲明隊(duì)列時(shí)設(shè)置1個(gè)x-message-ttl的屬性,并設(shè)置過(guò)期時(shí)間,凡是推送到該隊(duì)列中的所有消息,都會(huì)有一個(gè)30秒后過(guò)期的屬性。

          可以看到創(chuàng)建的隊(duì)列有TTL的特性,表示該隊(duì)列中的消息會(huì)自動(dòng)過(guò)期。

           

          TTL隊(duì)列

          如果同時(shí)指定了Message TTLQueue TTL,則優(yōu)先較小的那一個(gè)。

          RabbitMQ原生API實(shí)現(xiàn)消息自動(dòng)過(guò)期

          參考資料

          • RabbitMQ中的過(guò)期時(shí)間、死信隊(duì)列、延遲隊(duì)列

          代碼地址

          • github:

            https://github.com/senlinmu1008/spring-boot/tree/master/rabbitmq-ttl-dlx

          • gitee:

            https://gitee.com/ppbin/spring-boot/tree/master/rabbitmq-ttl-dlx





          粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

          ??????

          ??長(zhǎng)按上方微信二維碼 2 秒


          感謝點(diǎn)贊支持下哈 

          瀏覽 139
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲V国产v欧美v久久久久久 | 操逼综合| 69福利区 | 欧美黄色免费第一看 | 国产 无码 成人免费 |