很多朋友想了解關於淘寶幾天自動確認收貨的一些資料信息,下麵是(揚升資訊www.balincan8.com)小編整理的與淘寶幾天自動確認收貨相關的內容分享給大家,一起來看看吧。
目前常見的應用軟件都有消息的延遲推送的影子,應用也極為廣泛,例如:
淘寶七天自動確認收貨。在我們簽收商品後,物流係統會在七天後延時發送一個消息給支付係統,通知支付係統將款打給商家,這個過程持續七天,就是使用了消息中間件的延遲推送功能。12306 購票支付確認頁麵。我們在選好票點擊確定跳轉的頁麵中往往都會有倒計時,代表著 30 分鍾內訂單不確認的話將會自動取消訂單。其實在下訂單那一刻開始購票業務係統就會發送一個延時消息給訂單係統,延時30分鍾,告訴訂單係統訂單未完成,如果我們在30分鍾內完成了訂單,則可以通過邏輯代碼判斷來忽略掉收到的消息。在上麵兩種場景中,如果我們使用下麵兩種傳統解決方案無疑大大降低了係統的整體能和吞吐量:
使用 redis 給訂單設置過期時間,最後通過判斷 redis 中是否還有該訂單來決定訂單是否已經完成。這種解決方案相較於消息的延遲推送能較低,因為我們知道 redis 都是存儲於內存中,我們遇到惡意下單或者刷單的將會給內存帶來巨大壓力。使用傳統的數據庫輪詢來判斷數據庫表中訂單的狀態,這無疑增加了IO次數,能極低。使用 jvm 原生的 DelayQueue ,也是大量占用內存,而且沒有持久化策略,係統宕機或者重啟都會丟失訂單信息。消息延遲推送的實現在 RabbitMQ 3.6.x 之前我們一般采用信隊列+TTL過期時間來實現延遲隊列,我們這裏不做過多介紹。
在 RabbitMQ 3.6.x 開始,RabbitMQ 官方提供了延遲隊列的插件,可以下載放置到 RabbitMQ 根目錄下的 plugins 下。

圖片
首先我們創建交換機和消息隊列,application.properties 中配置與上一篇文章相同。
import org.springframework.amqp.core.*;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.HashMap;import java.util.Map;@Configurationpublic class MQConfig { public static final String LAZY_EXCHANGE = "Ex.LazyExchange" public static final String LAZY_QUEUE = "MQ.LazyQueue" public static final String LAZY_KEY = "lazy.#" @Bean public TopicExchange lazyExchange(){ //MapString, Object pros = new HashMap(); //設置交換機支持延遲消息推送 //pros.put("x-delayed-message", "topic"); TopicExchange exchange = new TopicExchange(LAZY_EXCHANGE, true, false, pros); exchange.setDelayed(true); return exchange; } @Bean public Queue lazyQueue(){ return new Queue(LAZY_QUEUE, true); } @Bean public Binding lazyBinding(){ return BindingBuilder.bind(lazyQueue()).to(lazyExchange()).with(LAZY_KEY); }}我們在 Exchange 的聲明中可以設置exchange.setDelayed(true)來開啟延遲隊列,也可以設置為以下內容傳入交換機聲明的方法中,因為第一種方式的底層就是通過這種方式來實現的。
//MapString, Object pros = new HashMap(); //設置交換機支持延遲消息推送 //pros.put("x-delayed-message", "topic"); TopicExchange exchange = new TopicExchange(LAZY_EXCHANGE, true, false, pros);發送消息時我們需要指定延遲推送的時間,我們這裏在發送消息的方法中傳入參數 new MessagePostProcessor() 是為了獲得 Message對象,因為需要借助 Message對象的api 來設置延遲時間。
import com.anqi.mq.config.MQConfig;import org.springframework.amqp.AmqpException;import org.springframework.amqp.core.Message;import org.springframework.amqp.core.MessageDeliveryMode;import org.springframework.amqp.core.MessagePostProcessor;import org.springframework.amqp.rabbit.connection.CorrelationData;import org.springframework.amqp.rabbit.core.RabbitTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import java.util.Date;@Componentpublic class MQSender { @Autowired private RabbitTemplate rabbitTemplate; //confirmCallback returnCallback 代碼省略,請參照上一篇 public void sendLazy(Object message){ rabbitTemplate.setMandatory(true); rabbitTemplate.setConfirmCallback(confirmCallback); rabbitTemplate.setReturnCallback(returnCallback); //id + 時間戳 全局唯一 CorrelationData correlationData = new CorrelationData("12345678909"+new Date()); //發送消息時指定 header 延遲時間 rabbitTemplate.convertAndSend(MQConfig.LAZY_EXCHANGE, "lazy.boot", message, new MessagePostProcessor() { @Override public Message postProcessMessage(Message message) throws AmqpException { //設置消息持久化 message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); //message.getMessageProperties().setHeader("x-delay", "6000"); message.getMessageProperties().setDelay(6000); return message; } }, correlationData); }}我們可以觀察 setDelay(Integer i)底層代碼,也是在 header 中設置 x-delay。等同於我們手動設置 header
message.getMessageProperties().setHeader("x-delay", "6000");/** * Set the x-delay header. * @param delay the delay. * @since 1.6 */public void setDelay(Integer delay) { if (delay == null || delay 0) { this.headers.remove(X_DELAY); } else { this.headers.put(X_DELAY, delay); }}消費端進行消費
import com.rabbitmq.client.Channel;import org.springframework.amqp.rabbit.annotation.*;import org.springframework.amqp.support.AmqpHeaders;import org.springframework.stereotype.Component;import java.io.IOException;import java.util.Map;@Componentpublic class MQReceiver { @RabbitListener(queues = "MQ.LazyQueue") @RabbitHandler public void onLazyMessage(Message msg, Channel channel) throws IOException{ long deliveryTag = msg.getMessageProperties().getDeliveryTag(); channel.basicAck(deliveryTag, true); System.out.println("lazy receive " + new String(msg.getBody())); } ```## 測試結果[#](https://www.cnblogs.com/haixiang/p/10966985.html#3724420099)```javaimport org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;@SpringBootTest@RunWith(SpringRunner.class)public class MQSenderTest { @Autowired private MQSender mqSender; @Test public void sendLazy() throws Exception { String msg = "hello spring boot" mqSender.sendLazy(msg + ":"); }}果然在 6 秒後收到了消息 lazy receive hello spring boot:
本文到此結束,希望對大家有所幫助呢。