在我們系統(tǒng)中有一個 訂單催付 的場景,我們的客戶在天貓下的訂單 , 淘寶會及時將訂單推送給我們,如果在用戶設(shè)定的時間內(nèi)未付款那么就會給用戶推送一條短信提醒,很簡單的一個功能對吧,但是,tianmao商家對我們來說,肯定是要分大客戶和小客戶的對吧,比如像蘋果,小米這樣大商家一年起碼能給我們創(chuàng)造很大的利潤,所以理應(yīng)當(dāng)然,他們的訂單必須得到優(yōu)先處理,而曾經(jīng)我們的后端系統(tǒng)是使用 redis 來存放的定時輪詢,大家都知道 redis 只能用 List 做一個簡簡單單的消息隊列,并不能實現(xiàn)一個優(yōu)先級的場景, 所以訂單量大了后采用 RabbitMQ 進(jìn)行改造和優(yōu)化 , 如果發(fā)現(xiàn)是大客戶的訂單給一個相對比較高的優(yōu)先級,否則就是默認(rèn)優(yōu)先級。
添加隊列
控制臺添加
?代碼添加優(yōu)先級
Map<String, Object> params = new HashMap();
params.put("x-max-priority", 10);
channel.queueDeclare("hello", true, false, false, params);
?消息中代碼添加優(yōu)先級
AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().priority(5).build();
?注意事項
?代碼
工具類?
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class RabbitMqUtils {
//得到一個連接的 channel
public static Channel getChannel() throws Exception{
//創(chuàng)建一個連接工廠
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("43.139.59.28");
factory.setUsername("guest");
factory.setPassword("guest");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
return channel;
}
}
生產(chǎn)者
import com.example.demo.util.RabbitMqUtils;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
public class Producer {
private static final String QUEUE_NAME="hello";
public static void main(String[] args) throws Exception {
try (Channel channel = RabbitMqUtils.getChannel();) {
//給消息賦予一個 priority 屬性
AMQP.BasicProperties properties = new
AMQP.BasicProperties().builder().priority(5).build();
for (int i = 1; i <11; i++) {
String message = "info"+i;
if(i==5){
channel.basicPublish("", QUEUE_NAME, properties, message.getBytes());
}else{
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
}
System.out.println("發(fā)送消息完成:" + message);
}
}
}
}
?生產(chǎn)者
import com.example.demo.util.RabbitMqUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import java.util.HashMap;
import java.util.Map;
public class Consumer {
private static final String QUEUE_NAME="hello";
public static void main(String[] args) throws Exception {
Channel channel = RabbitMqUtils.getChannel();
//設(shè)置隊列的最大優(yōu)先級 最大可以設(shè)置到 255 官網(wǎng)推薦 1-10 如果設(shè)置太高比較吃內(nèi)存和 CPU
Map<String, Object> params = new HashMap();
params.put("x-max-priority", 10);
channel.queueDeclare(QUEUE_NAME, true, false, false, params);
System.out.println("消費者啟動等待消費......");
DeliverCallback deliverCallback=(consumerTag, delivery)->{
String receivedMessage = new String(delivery.getBody());
System.out.println("接收到消息:"+receivedMessage);
};
channel.basicConsume(QUEUE_NAME,true,deliverCallback,(consumerTag)->{
System.out.println("消費者無法消費消息時調(diào)用,如隊列被刪除");
});
}
}
?結(jié)果
文章來源:http://www.zghlxwxcb.cn/news/detail-674460.html
?i==5的消息被設(shè)置優(yōu)先級為5,所以消息被最先消費文章來源地址http://www.zghlxwxcb.cn/news/detail-674460.html
到了這里,關(guān)于rabbitmq的優(yōu)先級隊列的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!