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)
猜你還喜歡下面的內(nèi)容