RabbitMQ-創(chuàng)新互聯(lián)

什么是消息的TTL?

TTL =?time?to?live,消息的TTL =?消息的存活時(shí)間或過(guò)期時(shí)間

成都創(chuàng)新互聯(lián)專注于蓬安企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),成都商城網(wǎng)站開(kāi)發(fā)。蓬安網(wǎng)站建設(shè)公司,為蓬安等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站建設(shè),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)什么是死信隊(duì)列?

當(dāng)隊(duì)列中的消息到達(dá)存活時(shí)間或過(guò)期時(shí)間后,若未設(shè)置死信隊(duì)列,則該消息將被拋棄,反之則轉(zhuǎn)入死信隊(duì)列

死信隊(duì)列

配置類

死信隊(duì)列僅需配置類,其與消息隊(duì)列的綁定在消息隊(duì)列的配置類中完成

// 死信隊(duì)列
@Configuration
public class DeadLetterConfiguration {

    //訂單交換機(jī)
    @Bean
    public DirectExchange deadLetterDirectExchange(){
        return new DirectExchange("dead_letter_direct_exchange_order", true, false);
    }

    //消息通知隊(duì)列
    @Bean
    public Queue deadLetterQueue(){
        return new Queue("dead_letter_queue", true, false, false);
    }

    //綁定交換機(jī)與隊(duì)列
    @Bean
    public Binding deadLetterDirectBinding(){
        return BindingBuilder.bind(deadLetterQueue()).to(deadLetterDirectExchange()).with("dead_letter_order");
    }
}

消息的TTL

消息的TTL分為消息隊(duì)列的TTL與消息本身的TTL

消息隊(duì)列的TTL:被轉(zhuǎn)發(fā)至該隊(duì)列中的所有消息均遵循該隊(duì)列的TTL規(guī)則

消息本身的TTL:消息遵循本身攜帶的TTL規(guī)則,不影響所處隊(duì)列中的其他消息

問(wèn):若同時(shí)存在消息隊(duì)列的TTL與消息本身的TTL,優(yōu)先級(jí)如何?

答:取時(shí)間短者

消息隊(duì)列的TTL

配置類

關(guān)于示例代碼中的參數(shù),可于RabbitMQ Management---Queue---Add a new queue---Arguments中查看

@Configuration
public class QueueTTLConfiguration {

    //訂單交換機(jī)
    @Bean
    public DirectExchange queueTTLDirectExchange(){
        return new DirectExchange("ttl_direct_exchange_order", true, false);
    }

    //消息通知隊(duì)列
    @Bean
    public Queue TTLQueue(){
        //TTL參數(shù)設(shè)置
        Mapargs = new HashMap<>();
        args.put("x-message-ttl", 5000);                                        //time to live 5000ms
        args.put("x-max-length", 5);                                            //隊(duì)列大消息數(shù)(溢出的消息移至死信隊(duì)列)
        args.put("x-dead-letter-exchange", "dead_letter_direct_exchange_order");//死信隊(duì)列交換機(jī)
        args.put("x-dead-letter-routing-key", "dead_letter_order");             //死信隊(duì)列routingKey(當(dāng)然 fanout交換機(jī)無(wú)需配置routingKey)
        return new Queue("ttl_queue", true, false, false, args);
    }

    //綁定交換機(jī)與隊(duì)列
    @Bean
    public Binding TTLDirectBinding(){
        return BindingBuilder.bind(TTLQueue()).to(queueTTLDirectExchange()).with("queue_ttl");
    }
}

生產(chǎn)者

@Service
public class QueueTTLOrderService {
    @Autowired
    RabbitTemplate rabbitTemplate;

    public void makeOrder(String userID, String producerID, int num){
        // 1.根據(jù)需求查詢倉(cāng)庫(kù) 判斷是否能滿足需求

        // 2.若能滿足則生成訂單
        String orderID = UUID.randomUUID().toString();
        System.out.println("成功生成訂單");

        // 3.通過(guò)RabbitMQ發(fā)送消息
        String exchangeName = "ttl_direct_exchange_order";
        String routingKey = "queue_ttl";
        rabbitTemplate.convertAndSend(exchangeName, routingKey, orderID + " queue_ttl");
        System.out.println("訂單發(fā)送成功");
    }
}

消費(fèi)者

此處僅演示消息隊(duì)列的TTL與死信隊(duì)列,故不添加消費(fèi)者

消息本身的TTL

配置類

此處演示不與死信隊(duì)列綁定情況下的TTL

@Configuration
public class MessageTTLConfiguration {

    //訂單交換機(jī)
    @Bean
    public DirectExchange messageTTLDirectExchange(){
        return new DirectExchange("ttl_direct_exchange_order", true, false);
    }

    //消息通知隊(duì)列
    @Bean
    public Queue messageTTLQueue(){
        return new Queue("message_ttl_queue", true, false, false);
    }

    //綁定交換機(jī)與隊(duì)列
    @Bean
    public Binding MessageTTLDirectBinding(){
        return BindingBuilder.bind(messageTTLQueue()).to(messageTTLDirectExchange()).with("message_ttl");
    }
}

生產(chǎn)者

@Service
public class MessageTTLOrderService {
    @Autowired
    RabbitTemplate rabbitTemplate;

    public void makeOrder(String userID, String producerID, int num){
        // 1.根據(jù)需求查詢倉(cāng)庫(kù) 判斷是否能滿足需求

        // 2.若能滿足則生成訂單
        String orderID = UUID.randomUUID().toString();
        System.out.println("成功生成訂單");

        // 3.通過(guò)RabbitMQ發(fā)送消息
        String exchangeName = "ttl_direct_exchange_order";
        String routingKey = "message_ttl";
        //消息傳輸加工機(jī) 此處用于為消息設(shè)置TTL時(shí)間
        MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration("5000");//Expiration 到期
                message.getMessageProperties().setContentEncoding("UTF-8");
                return message;
            }
        };
        // 將messagePostProcessor對(duì)象同消息一起傳遞
        rabbitTemplate.convertAndSend(exchangeName, routingKey, orderID + " message_ttl", messagePostProcessor);
        System.out.println("訂單發(fā)送成功");
    }
}

消費(fèi)者

此處僅演示消息本身的TTL,故不添加消費(fèi)者

測(cè)試

消息隊(duì)列的TTL:此處發(fā)送十條消息,溢出的五條會(huì)馬上被送至死信隊(duì)列,五秒后余下的五條也會(huì)被送至死信隊(duì)列

@Autowired
    QueueTTLOrderService queueTtlOrderService;
    @Test
    void ttlOrders(){
        for (int i = 0; i< 10; i++) {
            queueTtlOrderService.makeOrder("1", "1", 1);
        }
    }

消息本身的TTL:消息隊(duì)列并未設(shè)置上限,也未綁定死信隊(duì)列,故消息失效后將被直接拋棄

@Autowired
    MessageTTLOrderService messageTTLOrderService;
    @Test
    void messageTTLOrder() {
        messageTTLOrderService.makeOrder("1", "1", 1);
    }

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站題目:RabbitMQ-創(chuàng)新互聯(lián)
文章鏈接:http://muchs.cn/article42/dhsiec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)虛擬主機(jī)、網(wǎng)站內(nèi)鏈、App設(shè)計(jì)、服務(wù)器托管云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)