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