網(wǎng)站過期了怎么辦外貿(mào)網(wǎng)站建設(shè)優(yōu)化
這篇文章和大家分享Producer發(fā)布消息時(shí)如何設(shè)置消息過期時(shí)間,包括隊(duì)列級(jí)別和消息級(jí)別,還有如何設(shè)置隊(duì)列的過期時(shí)間。
消息過期時(shí)間
給消息設(shè)置TTL,在超過TTL值后,消息就會(huì)變成dead message(死信),訂閱此隊(duì)列的消費(fèi)者無(wú)法消費(fèi)(也不是絕地的,后續(xù)文章會(huì)介紹解決辦法)。只需要在申明隊(duì)列的時(shí)候,設(shè)置x-message-ttl 值即可,注意這種方式是隊(duì)列級(jí)別的,也就是隊(duì)列中消息的過期時(shí)間都是一樣的。下面是代碼實(shí)現(xiàn)。
HashMap args = new HashMap<>();
args.put("x-message-ttl", 5 * 1000);
channel.queueDeclare(queue, true, false, false, args);
如果不設(shè)置消息的ttl,消息不會(huì)過期;如果ttl設(shè)置為0,除非可以直接投遞給消費(fèi)者,否則消息會(huì)被丟棄。
每條消息可以設(shè)置不同的TTL,所以每條消息在被投遞到消費(fèi)者之前,才會(huì)判斷消息是否過期,這樣就會(huì)存在一種情況,后面的消息比前面的先過期,但是消費(fèi)者依然不能消費(fèi)到后面的消息,必須前面的消息先被投遞到消費(fèi)者,RabbitMQ就是采用這種方案的。下面用一張圖幫助理解。
設(shè)置消息級(jí)別的過期時(shí)間的代碼實(shí)例如下。
AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.deliveryMode(2); // 持久化消息
builder expiration( 60000 ); // 設(shè)置 TTL=60000ms
AMQP.BasicProperties properties = builder.build();
channel.basicPublish(exchangeName, routingKey, mandatory, properties, "ttlTestMessage".getBytes());
隊(duì)列過期時(shí)間
RabbitMQ不僅支持消息的TTL,還支持隊(duì)列級(jí)別的TTL,可以通過x-expires 參數(shù)控制在隊(duì)列刪除之前處于未使用狀態(tài)的時(shí)間,比如設(shè)置為1000,表示隊(duì)列在1s之內(nèi),沒有被使用,就會(huì)被刪除。注意,隊(duì)列級(jí)別的TTL不能設(shè)置為0。下面是代碼實(shí)現(xiàn)。
HashMap args = new HashMap<>();
args.put("x-expires", 20000);
channel.queueDeclare(queue, true, false,false, args);
隊(duì)列級(jí)別的TTL和消息級(jí)別的TTL不一樣,因?yàn)椴挥每紤]每條消息的TTL,只要隊(duì)列到了TTL,就可以被刪除。
好了,以上就是關(guān)于Producer設(shè)置消息級(jí)別和隊(duì)列級(jí)別的TTL,以及設(shè)置隊(duì)列本身的TTL
RabbitMQ系列文章會(huì)陸續(xù)更新,歡迎各位小伙伴關(guān)注后面的技術(shù)分享。