簡單實現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星,並把評價狀態...