中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot中怎么利用RabbitMQ實現優先級隊列

發布時間:2021-06-18 18:00:47 來源:億速云 閱讀:336 作者:Leah 欄目:大數據

這篇文章給大家介紹Spring Boot中怎么利用RabbitMQ實現優先級隊列,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

本地運行 RabbitMQ

docker run -d \
--name rabbitmq \
--restart always \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=user \
-e RABBITMQ_DEFAULT_PASS=password \
rabbitmq:3-management

訪問可視化面板

地址:http://127.0.0.1:15672/

賬號:user

密碼:password

Spring Boot With RabbitMQ

Spring Boot 集成 RabbitMQ

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

基本參數配置

# host & port
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672

Queue / Exchange / Routing 配置

/**
 * RabbitMQ 配置
 */
@Configuration
public class RabbitMQConfig {

    private static final String EXCHANGE = "priority-exchange";

    public static final String QUEUE = "priority-queue";

    private static final String ROUTING_KEY = "priority.queue.#";

    /**
     * 定義優先級隊列
     */
    @Bean
    Queue queue() {
        Map<String, Object> args= new HashMap<>();
        args.put("x-max-priority", 100);
        return new Queue(QUEUE, false, false, false, args);
    }

    /**
     * 定義交換器
     */
    @Bean
    TopicExchange exchange() {
        return new TopicExchange(EXCHANGE);
    }

    @Bean
    Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
    }

}

priority queue 定義參考官方文檔:https://www.rabbitmq.com/priority.html

Spring Boot中怎么利用RabbitMQ實現優先級隊列

Spring Boot 應用啟動后,會自動創建 Queue 和 Exchange ,并相互綁定,優先級隊列會有如圖所示標識。

RabbitMQ Publisher

Spring Boot 相關配置

# 是否開啟消息發送到交換器(Exchange)后觸發回調
spring.rabbitmq.publisher-confirms=false
# 是否開啟消息發送到隊列(Queue)后觸發回調
spring.rabbitmq.publisher-returns=false
# 消息發送失敗重試相關配置
spring.rabbitmq.template.retry.enabled=true
spring.rabbitmq.template.retry.initial-interval=3000ms
spring.rabbitmq.template.retry.max-attempts=3
spring.rabbitmq.template.retry.max-interval=10000ms
spring.rabbitmq.template.retry.multiplier=1

發送消息

@Component
@AllArgsConstructor
public class FileMessageSender {

    private static final String EXCHANGE = "priority-exchange";

    private static final String ROUTING_KEY_PREFIX = "priority.queue.";

    private final RabbitTemplate rabbitTemplate;

    /**
     * 發送設置有優先級的消息
     *
     * @param priority 優先級
     */
    public void sendPriorityMessage(String content, Integer priority) {
        rabbitTemplate.convertAndSend(EXCHANGE, ROUTING_KEY_PREFIX + "test", content,
                message -> {
                    message.getMessageProperties().setPriority(priority);
                    return message;
                });
    }

}

RabbitMQ Consumer

Spring Boot 相關配置

# 消息接收確認,可選模式:NONE(不確認)、AUTO(自動確認)、MANUAL(手動確認)
spring.rabbitmq.listener.simple.acknowledge-mode=AUTO
# 最小線程數量
spring.rabbitmq.listener.simple.concurrency=10
# 最大線程數量
spring.rabbitmq.listener.simple.max-concurrency=10
# 每個消費者可能未完成的最大未確認消息數量
spring.rabbitmq.listener.simple.prefetch=1

消費者執行耗時較長的話,建議 spring.rabbitmq.listener.simple.prefetch 設置為較小數值,讓優先級越高的消息更快加入到消費者線程。

監聽消息

@Slf4j
@Component
public class MessageListener {

    /**
     * 處理消息
     */
    @RabbitListener(queues = "priority-queue")
    public void listen(String message) {
        log.info(message);
    }

}

番外補充

1、自定義消息發送確認的回調

配置如下:

# 開啟消息發送到交換器(Exchange)后觸發回調
spring.rabbitmq.publisher-confirms=true
# 開啟消息發送到隊列(Queue)后觸發回調
spring.rabbitmq.publisher-returns=true

自定義

RabbitTemplate.ConfirmCallback

實現類

@Slf4j
public class RabbitConfirmCallBack implements RabbitTemplate.ConfirmCallback{

    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        log.info("消息唯一標識: {}", correlationData);
        log.info("確認狀態: {}", ack);
        log.info("造成原因: {}", cause);
    }

}

自定義

RabbitTemplate.ConfirmCallback

實現類

@Slf4j
public class RabbitReturnCallback implements RabbitTemplate.ReturnCallback {

    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        log.info("消息主體: {}", message);
        log.info("回復編碼: {}", replyCode);
        log.info("回復內容: {}", replyText);
        log.info("交換器: {}", exchange);
        log.info("路由鍵: {}", routingKey);
    }

}

配置 rabbitTemplate

@Component
@AllArgsConstructor
public class RabbitTemplateInitializingBean implements InitializingBean {

    private final RabbitTemplate rabbitTemplate;

    @Override
    public void afterPropertiesSet() {
        rabbitTemplate.setConfirmCallback(new RabbitConfirmCallBack());
        rabbitTemplate.setReturnCallback(new RabbitReturnCallback());
    }
    
}

關于Spring Boot中怎么利用RabbitMQ實現優先級隊列就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金阳县| 新泰市| 寿宁县| 开化县| 阜南县| 聊城市| 刚察县| 广南县| 城市| 新野县| 额济纳旗| 惠来县| 平定县| 陆河县| 东莞市| 田阳县| 嘉峪关市| 乌审旗| 扬州市| 遂宁市| 米易县| 普安县| 县级市| 万山特区| 鲁甸县| 金门县| 葫芦岛市| 紫云| 肥城市| 连山| 阳东县| 铁岭县| 岗巴县| 夏邑县| 八宿县| 临沭县| 安宁市| 克拉玛依市| 东源县| 金川县| 紫云|