91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

怎么在SpringBoot中利用RabbitMQ 實現一個手動應答功能

發布時間:2021-01-11 15:01:50 來源:億速云 閱讀:472 作者:Leah 欄目:開發技術

本篇文章為大家展示了怎么在SpringBoot中利用RabbitMQ 實現一個手動應答功能,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

版本說明

  • JDK 1.8

  • RabbitMQ 3.7.15 Erlang 22.0

  • SpringBoot 2.3.3.RELEASE

  • // TODO 2021年1月8日 整理CentOS安裝RabbitMQ流程

1. 在RabbitMQ的Web管理界面,創建test隊列

怎么在SpringBoot中利用RabbitMQ 實現一個手動應答功能

參數的含義

durability:是否持久化(重啟或宕機后消息依然保存)

  • durable 持久

  • transient 暫時

新建maven項目。

2. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <groupId>com.demo</groupId>
  <artifactId>rabbitmq-demo</artifactId>
  <version>1.0.0</version>

  <properties>
    <lombok.version>1.18.12</lombok.version>
  </properties>

  <dependencies>
    <!--web 模塊-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

    <!-- lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
      <scope>provided</scope>
      <version>${lombok.version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

3. application.yaml

server:
 port: 20002
spring:
 rabbitmq:
 	# 這里我改了本地的hosts,實際地址是192.168.0.121
  host: vm.com
  port: 5672
  virtual-host: /
  username: admin
  password: admin
  # 開啟消息確認模式
  # 消息發送到交換機確認機制,是否確認回調
  # publisher-confirms: true
  # 是否返回回調
  publisher-returns: true
  template:
   #開啟mandatory: true, basic.return方法將消息返還給生產者
   mandatory: true
  listener:
   simple:
   	# 手動應答
    acknowledge-mode: manual
    # 最少消費者數量
    concurrency: 1 
    # 最多消費者數量
    max-concurrency: 10
    # 支持重試
    retry:
     enabled: true

端口

  • 5672:RabbitMQ的通信端口

  • 15672:Web管理界面端口

4. RabbitmqDemo.java

@SpringBootApplication
@EnableRabbit
public class RabbitmqDemoApplication {
  
  public static void main(String[] args) {
    SpringApplication.run(RabbitmqDemoApplication.class, args);
  }
}

5. RabbitConfig.java

@Configuration
@Slf4j
public class RabbitConfig {

  private RabbitTemplate rabbitTemplate;

  @Bean
  public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
    rabbitTemplate = new RabbitTemplate(connectionFactory);
    return rabbitTemplate;
  }

}

配置RabbitMQ的消息模板。

6. 消息生產者 produce.java

@Component
public class Producer {
  
  // @Qualifier("rabbitTemplate")
  @Autowired
  private RabbitTemplate rabbitTemplate;

  public void send() {
    for (int i = 0; i < 5; i++) {
      System.out.println("生產者發送消息,序號為: " + i);
      rabbitTemplate.convertAndSend("test", String.valueOf(i));
    }
  }
}

初始化消息發送模板RabbitTemplate,@Qualifier注解用于限定具體的實現類,這里可以不指定。

7. 消息消費者 consumer.java

消費者1和消費者2均監聽test隊列。

不同的是,消費者1收到消息后返回確認應答basicAck。

而消費者2收到消息后返回拒絕應答basicRegect,消息被消費者拒絕后重新回到test隊列中,等待下次發送給消費者。

@Component
@Slf4j
public class Consumer {

  /**
   * 消費者1 模擬正常處理消息的情況,消息處理完畢發送確認應答
   * @param message
   * @param channel
   * @throws IOException
   */
  @RabbitListener(queues = "test")
  public void process1(Message message, Channel channel) throws IOException {
    log.info("消費者1 接收消息: " + new String(message.getBody()));
    log.info("消費者1 確認應答消息:" + new String(message.getBody()));
    channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
  }

  /**
   * 消費者2 模擬處理消息出錯的情況,消費者2向rabbitmq發送拒絕應答。
   * 處理失敗的消息會被重新放入ready中,再次發送給消費者,直至收到確認應答
   * @param message
   * @param channel
   * @throws IOException
   */
  @RabbitListener(queues = "test")
  public void process2(Message message, Channel channel) throws IOException {
    log.info("消費者2 接收消息:" + new String(message.getBody()));
    log.info("消費者2 拒絕應答消息:" + new String(message.getBody()));
    channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
  }
}

8. 測試RabbitMqController.java

@RestController
@RequestMapping("")
public class RabbitMqController {

  @Autowired
  private Producer producer;

  @GetMapping("/send")
  public String send() {
    producer.send();
    return "發送完成";
  }
}

9. 測試

使用postman或瀏覽器使用Get方法請求http://localhost:20001/send,生產者會向RabbitMQ的test隊列發送5條消息:

生產者發送消息,序號為: 0
生產者發送消息,序號為: 1
生產者發送消息,序號為: 2
生產者發送消息,序號為: 3
生產者發送消息,序號為: 4

怎么在SpringBoot中利用RabbitMQ 實現一個手動應答功能

可以看出序號為2的消息3次被消費者2接收,消費者2也3次發送拒絕應答,直到第4次才被消費者1接收,并返回確認應答。

上述內容就是怎么在SpringBoot中利用RabbitMQ 實現一個手動應答功能,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

宜州市| 三台县| 霍城县| 来宾市| 张家港市| 罗甸县| 桂林市| 南川市| 屏边| 靖边县| 灌阳县| 东明县| 固阳县| 墨玉县| 民县| 藁城市| 名山县| 当涂县| 孟连| 营口市| 久治县| 东宁县| 新干县| 彝良县| 扶风县| 晋江市| 浠水县| 河津市| 章丘市| 江都市| 滨海县| 乌兰浩特市| 嵊州市| 鲜城| 太保市| 柞水县| 鹤庆县| 文成县| 乌兰县| 屏东县| 抚远县|