中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站安全檢測(cè)在線武漢seo網(wǎng)站優(yōu)化

網(wǎng)站安全檢測(cè)在線,武漢seo網(wǎng)站優(yōu)化,ps軟件免費(fèi)版在哪下載,博客可以放自己做的網(wǎng)站目錄 成為死信的條件 消息TTL過(guò)期 隊(duì)列達(dá)到最大長(zhǎng)度 消息被拒 延遲隊(duì)列 延遲隊(duì)列使用場(chǎng)景 消息設(shè)置 TTL 隊(duì)列設(shè)置 TTL 兩者區(qū)別 producer 將消息投遞到 broker 或者直接到 queue 里了, consumer 從 queue 取出消息 進(jìn)行消費(fèi),但某些時(shí)候由…

目錄

成為死信的條件?

消息TTL過(guò)期?

?隊(duì)列達(dá)到最大長(zhǎng)度

?消息被拒

延遲隊(duì)列

?延遲隊(duì)列使用場(chǎng)景

?消息設(shè)置 TTL

隊(duì)列設(shè)置 TTL

?兩者區(qū)別


?

producer 將消息投遞到 broker 或者直接到 queue 里了, consumer queue 取出消息
進(jìn)行消費(fèi),但某些時(shí)候由于特定的 原因?qū)е? queue 中的某些消息無(wú)法被消費(fèi) ,這樣的消息如果沒(méi)有后續(xù)的處理,就變成了死信,有死信自然就有了死信隊(duì)列。

成為死信的條件?

  1. 超過(guò)消息的存活時(shí)間(TTL):可以為消息設(shè)置一個(gè)存活時(shí)間,在該時(shí)間段之后,如果消息還未被消費(fèi)或者被重新投遞到其他隊(duì)列,該消息將成為死信。

  2. 消息被拒絕(Reject):當(dāng)消息被消費(fèi)者拒絕接收時(shí),可以選擇將該消息重新投遞到另一個(gè)隊(duì)列或?qū)⑵錁?biāo)記為死信。

  3. 消息達(dá)到最大重試次數(shù):可以通過(guò)在消費(fèi)者端設(shè)置重試次數(shù)限制,當(dāng)消息達(dá)到一定的重試次數(shù)而仍然無(wú)法被消費(fèi)時(shí),該消息將成為死信。

  4. 隊(duì)列滿溢(Queue Overflow):當(dāng)一個(gè)隊(duì)列的消息數(shù)量已經(jīng)超過(guò)隊(duì)列的最大容量限制時(shí),新消息無(wú)法進(jìn)入隊(duì)列,而被視為死信。

?

消息TTL過(guò)期?

生產(chǎn)者?

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;public class Producer {private static final String NORMAL_EXCHANGE = "normal_exchange";public static void main(String[] argv) throws Exception {try (Channel channel = RabbitMqUtils.getChannel()) {channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);//設(shè)置消息的 TTL 時(shí)間AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("10000").build();//該信息是用作演示隊(duì)列個(gè)數(shù)限制for (int i = 1; i <11 ; i++) {String message="info"+i;channel.basicPublish(NORMAL_EXCHANGE, "zhangsan", properties,message.getBytes());System.out.println("生產(chǎn)者發(fā)送消息:"+message);}}}
}

?消費(fèi)者1

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;import java.util.HashMap;
import java.util.Map;public class Consumer01 {//普通交換機(jī)名稱private static final String NORMAL_EXCHANGE = "normal_exchange";//死信交換機(jī)名稱private static final String DEAD_EXCHANGE = "dead_exchange";public static void main(String[] argv) throws Exception {Channel channel = RabbitMqUtils.getChannel();//聲明死信和普通交換機(jī) 類型為 directchannel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);//聲明死信隊(duì)列String deadQueue = "dead-queue";channel.queueDeclare(deadQueue, false, false, false, null);//死信隊(duì)列綁定死信交換機(jī)與 routingkeychannel.queueBind(deadQueue, DEAD_EXCHANGE, "lisi");//正常隊(duì)列綁定死信隊(duì)列信息Map<String, Object> params = new HashMap<>();//正常隊(duì)列設(shè)置死信交換機(jī) 參數(shù) key 是固定值params.put("x-dead-letter-exchange", DEAD_EXCHANGE);//正常隊(duì)列設(shè)置死信 routing-key 參數(shù) key 是固定值params.put("x-dead-letter-routing-key", "lisi");String normalQueue = "normal-queue";channel.queueDeclare(normalQueue, false, false, false, params);channel.queueBind(normalQueue, NORMAL_EXCHANGE, "zhangsan");System.out.println("等待接收消息.....");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println("Consumer01 接收到消息"+message);};channel.basicConsume(normalQueue, true, deliverCallback, consumerTag -> {});}
}

消費(fèi)者2

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;public class Consumer02 {private static final String DEAD_EXCHANGE = "dead_exchange";public static void main(String[] argv) throws Exception {Channel channel = RabbitMqUtils.getChannel();channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);String deadQueue = "dead-queue";channel.queueDeclare(deadQueue, false, false, false, null);channel.queueBind(deadQueue, DEAD_EXCHANGE, "lisi");System.out.println("等待接收死信隊(duì)列消息.....");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println("Consumer02 接收死信隊(duì)列的消息" + message);};channel.basicConsume(deadQueue, true, deliverCallback, consumerTag -> {});}
}

關(guān)閉消費(fèi)者1,模擬出故障

正常隊(duì)列

?消息超時(shí)進(jìn)入死信隊(duì)列

?死信隊(duì)列接收信息

?隊(duì)列達(dá)到最大長(zhǎng)度

生產(chǎn)者

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;public class Producer {private static final String NORMAL_EXCHANGE = "normal_exchange";public static void main(String[] argv) throws Exception {try (Channel channel = RabbitMqUtils.getChannel()) {channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);//該信息是用作演示隊(duì)列個(gè)數(shù)限制for (int i = 1; i <11 ; i++) {String message="info"+i;channel.basicPublish(NORMAL_EXCHANGE,"zhangsan",null, message.getBytes());System.out.println("生產(chǎn)者發(fā)送消息:"+message);}}}
}

?消費(fèi)者1

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;import java.util.HashMap;
import java.util.Map;public class Consumer01 {//普通交換機(jī)名稱private static final String NORMAL_EXCHANGE = "normal_exchange";//死信交換機(jī)名稱private static final String DEAD_EXCHANGE = "dead_exchange";public static void main(String[] argv) throws Exception {Channel channel = RabbitMqUtils.getChannel();//聲明死信和普通交換機(jī) 類型為 directchannel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);//聲明死信隊(duì)列String deadQueue = "dead-queue";channel.queueDeclare(deadQueue, false, false, false, null);//死信隊(duì)列綁定死信交換機(jī)與 routingkeychannel.queueBind(deadQueue, DEAD_EXCHANGE, "lisi");//正常隊(duì)列綁定死信隊(duì)列信息Map<String, Object> params = new HashMap<>();//正常隊(duì)列設(shè)置死信交換機(jī) 參數(shù) key 是固定值params.put("x-dead-letter-exchange", DEAD_EXCHANGE);//正常隊(duì)列設(shè)置死信 routing-key 參數(shù) key 是固定值params.put("x-dead-letter-routing-key", "lisi");// 設(shè)置正常隊(duì)列長(zhǎng)度的限制params.put("x-max-length",6);String normalQueue = "normal-queue";channel.queueDeclare(normalQueue, false, false, false, params);channel.queueBind(normalQueue, NORMAL_EXCHANGE, "zhangsan");System.out.println("等待接收消息.....");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println("Consumer01 接收到消息"+message);};channel.basicConsume(normalQueue, true, deliverCallback, consumerTag -> {});}
}

?消費(fèi)者2

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;public class Consumer02 {private static final String DEAD_EXCHANGE = "dead_exchange";public static void main(String[] argv) throws Exception {Channel channel = RabbitMqUtils.getChannel();channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);String deadQueue = "dead-queue";channel.queueDeclare(deadQueue, false, false, false, null);channel.queueBind(deadQueue, DEAD_EXCHANGE, "lisi");System.out.println("等待接收死信隊(duì)列消息.....");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println("Consumer02 接收死信隊(duì)列的消息" + message);};channel.basicConsume(deadQueue, true, deliverCallback, consumerTag -> {});}
}

關(guān)閉消費(fèi)者1,模擬接收不到信息

?死信隊(duì)列消費(fèi)了四個(gè)消息

?分析:生產(chǎn)者產(chǎn)生10個(gè)消息,正常隊(duì)列只能接受6個(gè)消息,多的消息便被轉(zhuǎn)移到死信隊(duì)列去了

?消息被拒

生產(chǎn)者

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;public class Producer {private static final String NORMAL_EXCHANGE = "normal_exchange";public static void main(String[] argv) throws Exception {try (Channel channel = RabbitMqUtils.getChannel()) {channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);//該信息是用作演示隊(duì)列個(gè)數(shù)限制for (int i = 1; i <11 ; i++) {String message="info"+i;channel.basicPublish(NORMAL_EXCHANGE,"zhangsan",null, message.getBytes());System.out.println("生產(chǎn)者發(fā)送消息:"+message);}}}
}

消費(fèi)者1


import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;import java.util.HashMap;
import java.util.Map;public class Consumer01 {//普通交換機(jī)名稱private static final String NORMAL_EXCHANGE = "normal_exchange";//死信交換機(jī)名稱private static final String DEAD_EXCHANGE = "dead_exchange";public static void main(String[] argv) throws Exception {Channel channel = RabbitMqUtils.getChannel();//聲明死信和普通交換機(jī) 類型為 directchannel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);//聲明死信隊(duì)列String deadQueue = "dead-queue";channel.queueDeclare(deadQueue, false, false, false, null);//死信隊(duì)列綁定死信交換機(jī)與 routingkeychannel.queueBind(deadQueue, DEAD_EXCHANGE, "lisi");//正常隊(duì)列綁定死信隊(duì)列信息Map<String, Object> params = new HashMap<>();//正常隊(duì)列設(shè)置死信交換機(jī) 參數(shù) key 是固定值params.put("x-dead-letter-exchange", DEAD_EXCHANGE);//正常隊(duì)列設(shè)置死信 routing-key 參數(shù) key 是固定值params.put("x-dead-letter-routing-key", "lisi");String normalQueue = "normal-queue";channel.queueDeclare(normalQueue, false, false, false, params);channel.queueBind(normalQueue, NORMAL_EXCHANGE, "zhangsan");System.out.println("等待接收消息.....");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");if(message.equals("info5")){System.out.println("Consumer01 接收到消息" + message + "并拒絕簽收該消息");//requeue 設(shè)置為 false 代表拒絕重新入隊(duì) 該隊(duì)列如果配置了死信交換機(jī)將發(fā)送到死信隊(duì)列中channel.basicReject(delivery.getEnvelope().getDeliveryTag(), false);}else {System.out.println("Consumer01 接收到消息"+message);channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);}};boolean autoAck = false;channel.basicConsume(normalQueue, autoAck, deliverCallback, consumerTag -> {});}
}

?消費(fèi)者2

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;public class Consumer02 {private static final String DEAD_EXCHANGE = "dead_exchange";public static void main(String[] argv) throws Exception {Channel channel = RabbitMqUtils.getChannel();channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);String deadQueue = "dead-queue";channel.queueDeclare(deadQueue, false, false, false, null);channel.queueBind(deadQueue, DEAD_EXCHANGE, "lisi");System.out.println("等待接收死信隊(duì)列消息.....");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println("Consumer02 接收死信隊(duì)列的消息" + message);};channel.basicConsume(deadQueue, true, deliverCallback, consumerTag -> {});}
}

?結(jié)果

消費(fèi)者1,拒絕接受消息info5,info5進(jìn)入死信隊(duì)列

?消費(fèi)者2,死信隊(duì)列接受到info5

延遲隊(duì)列

延時(shí)隊(duì)列 , 隊(duì)列內(nèi)部是有序的,最重要的特性就體現(xiàn)在它的延時(shí)屬性上,延時(shí)隊(duì)列中的元素是希望
在指定時(shí)間到了以后或之前取出和處理,簡(jiǎn)單來(lái)說(shuō),延時(shí)隊(duì)列就是用來(lái)存放需要在指定時(shí)間被處理的 元素的隊(duì)列。

?延遲隊(duì)列使用場(chǎng)景

1. 訂單在十分鐘之內(nèi)未支付則自動(dòng)取消
2. 新創(chuàng)建的店鋪,如果在十天內(nèi)都沒(méi)有上傳過(guò)商品,則自動(dòng)發(fā)送消息提醒。
3. 用戶注冊(cè)成功后,如果三天內(nèi)沒(méi)有登陸則進(jìn)行短信提醒。
4. 用戶發(fā)起退款,如果三天內(nèi)沒(méi)有得到處理則通知相關(guān)運(yùn)營(yíng)人員。
5. 預(yù)定會(huì)議后,需要在預(yù)定的時(shí)間點(diǎn)前十分鐘通知各個(gè)與會(huì)人員參加會(huì)議

?消息設(shè)置 TTL

?

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;public class Producer {private static final String NORMAL_EXCHANGE = "normal_exchange";public static void main(String[] argv) throws Exception {try (Channel channel = RabbitMqUtils.getChannel()) {channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);//設(shè)置消息的 TTL 時(shí)間AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("10000").build();//該信息是用作演示隊(duì)列個(gè)數(shù)限制for (int i = 1; i <11 ; i++) {String message="info"+i;channel.basicPublish(NORMAL_EXCHANGE, "zhangsan", properties,message.getBytes());System.out.println("生產(chǎn)者發(fā)送消息:"+message);}}}
}

隊(duì)列設(shè)置 TTL

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;import java.util.HashMap;
import java.util.Map;public class Consumer01 {//普通交換機(jī)名稱private static final String NORMAL_EXCHANGE = "normal_exchange";//死信交換機(jī)名稱private static final String DEAD_EXCHANGE = "dead_exchange";public static void main(String[] argv) throws Exception {Channel channel = RabbitMqUtils.getChannel();//聲明死信和普通交換機(jī) 類型為 directchannel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);//聲明死信隊(duì)列String deadQueue = "dead-queue";channel.queueDeclare(deadQueue, false, false, false, null);//死信隊(duì)列綁定死信交換機(jī)與 routingkeychannel.queueBind(deadQueue, DEAD_EXCHANGE, "lisi");//正常隊(duì)列綁定死信隊(duì)列信息Map<String, Object> params = new HashMap<>();//正常隊(duì)列設(shè)置死信交換機(jī) 參數(shù) key 是固定值params.put("x-dead-letter-exchange", DEAD_EXCHANGE);//正常隊(duì)列設(shè)置死信 routing-key 參數(shù) key 是固定值params.put("x-dead-letter-routing-key", "lisi");// 設(shè)置 TTL 值為 5000 毫秒(5 秒)params.put("x-message-ttl", 5000);String normalQueue = "normal-queue";channel.queueDeclare(normalQueue, false, false, false, params);channel.queueBind(normalQueue, NORMAL_EXCHANGE, "zhangsan");System.out.println("等待接收消息.....");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");if(message.equals("info5")){System.out.println("Consumer01 接收到消息" + message + "并拒絕簽收該消息");//requeue 設(shè)置為 false 代表拒絕重新入隊(duì) 該隊(duì)列如果配置了死信交換機(jī)將發(fā)送到死信隊(duì)列中channel.basicReject(delivery.getEnvelope().getDeliveryTag(), false);}else {System.out.println("Consumer01 接收到消息"+message);channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);}};boolean autoAck = false;channel.basicConsume(normalQueue, autoAck, deliverCallback, consumerTag -> {});}
}

?兩者區(qū)別

如果設(shè)置了隊(duì)列的 TTL 屬性,那么一旦消息過(guò)期,就會(huì)被隊(duì)列丟棄 ( 如果配置了死信隊(duì)列被丟到死信隊(duì)列中) ,而第二種方式,消息即使過(guò)期,也不一定會(huì)被馬上丟棄,因?yàn)?/span> 消息是否過(guò)期是在即將投遞到消費(fèi)者 之前判定的 ,如果當(dāng)前隊(duì)列有嚴(yán)重的消息積壓情況,則已過(guò)期的消息也許還能存活較長(zhǎng)時(shí)間;另外,還需 要注意的一點(diǎn)是,如果不設(shè)置 TTL ,表示消息永遠(yuǎn)不會(huì)過(guò)期,如果將 TTL 設(shè)置為 0 ,則表示除非此時(shí)可以 直接投遞該消息到消費(fèi)者,否則該消息將會(huì)被丟棄。

?

http://www.risenshineclean.com/news/2982.html

相關(guān)文章:

  • 北京門戶網(wǎng)站設(shè)計(jì)打開2345網(wǎng)址大全
  • 西安網(wǎng)站推廣方案建網(wǎng)站公司
  • windows7做網(wǎng)站安卓?jī)?yōu)化大師2023
  • 網(wǎng)站如何做后臺(tái)太原seo服務(wù)
  • 用dw做網(wǎng)站時(shí)怎么添加彈窗拉新工作室在哪里接項(xiàng)目
  • 杭州做銷售去哪個(gè)網(wǎng)站好做網(wǎng)站用什么軟件
  • 沒(méi)有網(wǎng)站怎么做鏈接視頻教程5118關(guān)鍵詞工具
  • 上虞網(wǎng)站建設(shè)哪家好北京營(yíng)銷推廣網(wǎng)站建設(shè)
  • wordpress網(wǎng)站亂碼關(guān)鍵詞挖掘啊愛站網(wǎng)
  • 免費(fèi)b站推廣網(wǎng)站app如何讓百度搜索排名靠前
  • 網(wǎng)站互動(dòng)交流怎么做百度中心人工電話號(hào)碼
  • 互聯(lián)網(wǎng)網(wǎng)站基礎(chǔ)中國(guó)最大網(wǎng)站排名
  • wordpress adsense主題游戲優(yōu)化大師下載安裝
  • 山東網(wǎng)站建設(shè)優(yōu)化技術(shù)太原做網(wǎng)站的工作室
  • 如何用frontpage做網(wǎng)站seo快速優(yōu)化文章排名
  • 信息分類網(wǎng)站好建嗎百度輿情
  • 南京網(wǎng)站建設(shè)王道下拉強(qiáng)獨(dú)立站seo
  • 建設(shè)銀行網(wǎng)站的支付流程太原整站優(yōu)化排名外包
  • 一個(gè)網(wǎng)站的頁(yè)頭大概做多大有沒(méi)有免費(fèi)的廣告平臺(tái)
  • 曰本做爰視頻網(wǎng)站開發(fā)新客戶的十大渠道
  • 用樹莓派做網(wǎng)站服務(wù)器太原推廣團(tuán)隊(duì)
  • 龍巖政府網(wǎng)seo教程自學(xué)
  • 做網(wǎng)站需要哪些費(fèi)用支出瀏覽器網(wǎng)頁(yè)版入口
  • jsp網(wǎng)站開發(fā)四庫(kù)全書網(wǎng)絡(luò)營(yíng)銷什么意思
  • 網(wǎng)站后臺(tái)圖片傳不上去怎么辦汕頭seo外包機(jī)構(gòu)
  • 如何用iis部署網(wǎng)站網(wǎng)站頁(yè)面設(shè)計(jì)模板
  • 山東網(wǎng)站建設(shè)最便宜如何讓百度能查到自己
  • 點(diǎn)擊一個(gè)網(wǎng)站跳轉(zhuǎn)到圖片怎么做的淘寶關(guān)鍵詞排名查詢工具免費(fèi)
  • 網(wǎng)站建設(shè)公司普遍存在劣勢(shì)數(shù)據(jù)分析師資格證書怎么考
  • 北京上地做網(wǎng)站seo西安