實現mq延時佇列(訂單延時取消)

2021-09-11 02:27:08 字數 2826 閱讀 9741

簡單實現mq延時佇列

1.rabbitmqconfiguration (mq配置類)

@configuration

@slf4j

public class rabbitmqconfiguration") string host,

@value("$") int port, @value("$") string username,

@value("$") string password,

@value("$") boolean publisherconfirms)

@suppresswarnings("alibabaremovecommentedcode")

@bean(name = mqproperties.container_factory)

public ******rabbitlistenercontaine***ctory rabbitlistenercontaine***ctory(connectionfactory connectionfactory)

@bean

public amqptemplate amqptemplate(@autowired connectionfactory connectionfactory) > replycode<{}> reason<{}> exchange<{}> routekey<{}>",

correlationid, replycode, replytext, exchange, routingkey);

}});

// 訊息確認,yml需要配置 publisher-confirms: true

rabbittemplate.setconfirmcallback((correlationdata, ack, cause) -> >", correlationdata.getid());

}} else >", cause);}}

});return rabbittemplate;

}/**

* 構建管理類

** @param connectionfactory

* @param mqproperties

* @return

*/@bean

public amqpadmin amqpadmin(@autowired connectionfactory connectionfactory, @autowired mqproperties mqproperties)

}

2.mqsendservice(mq服務類,傳送mq訊息)

/**

* 有有效期的的佇列

* * @param exchange 交換機名稱

* @param queuename 佇列名稱

* @param message訊息內容

* @param times 延遲時間 單位毫秒

*/@async

public void send(string exchange, string queuename, string message, long times)

};amqptemplate.convertandsend(exchange, queuename, message, processor);

}

3.orderservice(建立訂單時傳送死信訊息)

// 啟動延時佇列 (為了準時取消,須保證mq服務時間與api服務時間一致)

mqsendservice.send(mqproperties.getexchangeorderpre(), mqproperties.getsendorderpredlx(), orderid.tostring(),

loanprestatusduration);

4.loanmqlistener 接受死信**佇列訊息,取消超時訂單

@component

@slf4j

public class loanmqlistener extends basemqlistener ", containe***ctory = mqproperties.container_factory)

public void preloanovertime(string content) 延時取消", content);

loanhandleservice.cancelloanbypretimeout(long.parselong(content));

}}

5.補充.mqproperties

/**

* mq 配置

*/@component

@data

@tostring

public class mqproperties ")

private string sendorderpredlx;

/*** 訂單死信**佇列

*/@value("$")

private string queueorderdrt;

/*** 訂單死信**佇列交換機

*/@value("$")

private string exchangeorderpre;

}

6.總結:

優點:可以實現實時取消訂單,及時恢復訂單占用資源(如訂單中的商品),不占用應用伺服器資源

缺點:可能會導致訊息大量堆積

死信訊息可能會導致運維預警,需要溝通

歡迎補充

MQ 再談延時佇列

最近專案裡有需求,在介面呼叫完畢後將一些訊息通過mq通知給另乙個服務,並且因為業務的原因,需要停留一分鐘再投遞到mq,另乙個團隊來消費,我本來想用rabbitmq 以下簡稱rmq 來實現,但經過和同事討論決定不用rmq來實現延時,rmq只充當訊息通知,延時在本地進行實現。本地採用乙個單機的延時佇列,...

RabbitMQ延時佇列實現訂單關閉

配置virtual host虛擬主機 spring.rabbitmq.virtual host test order close ip位址 spring.rabbitmq.host 127.0 0.1 使用者名稱 密碼 spring.rabbitmq.username guest spring.ra...

MQ如何實現訊息延時

很多時候,業務有 在一段時間之後,完成乙個工作任務 的需求。例如 滴滴打車訂單完成後,如果使用者一直不評價,48小時後會將自動評價為5星。一般來說怎麼實現這類 48小時後自動評價為5星 需求呢?常見方案 啟動乙個cron定時任務,每小時跑一次,將完成時間超過48小時的訂單取出,置為5星,並把評價狀態...