1. 程式人生 > >Spring Boot 揭祕與實戰之RabbitMQ

Spring Boot 揭祕與實戰之RabbitMQ

Spring Boot 整合 RabbitMQ

Spring Boot 整合 RabbitMQ 是非常容易,只需要兩個步驟。

首先,在 pom.xml 中增加 RabbitMQ 依賴。

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

第二步,在 src/main/resources/application.properties 中配置資訊。

#rabbitmq
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

實戰演練

一個簡單的實戰開始

我們來實現一個簡單的傳送、接收訊息。

Configuration

在 Spring Boot 中使用 @Bean 註冊一個佇列。

@Configuration
public class RabbitMQConfig {
 public static final String QUEUE_NAME = "spring-boot-simple"
; @Bean public Queue queue() { return new Queue(QUEUE_NAME); } }

訊息生產者

建立訊息生產者 Sender。通過注入 AmqpTemplate 介面的例項來實現訊息的傳送。

@Service
public class Sender {
 @Autowired
 private AmqpTemplate rabbitTemplate;
 public void send() {
 System.out.println("樑桂釗 傳送訊息...");
 rabbitTemplate.convertAndSend(RabbitMQConfig.QUEUE_NAME, "你好, 樑桂釗!"
); } } 消

息消費者

建立訊息消費者 Receiver。通過 @RabbitListener 註解定義對佇列的監聽。

@Service
public class Receiver {
 @Autowired
 private AmqpTemplate rabbitTemplate;
 @RabbitListener(queues = "spring-boot-simple")
 public void receiveMessage(String message) {
 System.out.println("Received <" + message + ">");
 }
}

執行

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.lianggzone.springboot" })
public class RunMain {
 public static void main(String[] args) {
 SpringApplication.run(RunMain.class, args);
 }
}

單元測試

建立單元測試用例

public class RabbitMQTest {
 @Autowired
 private Sender sender;
 @Test
 public void send() throws Exception {
 sender.send();
 }
}

路由的實戰演練

經過上面的實戰案例,我們對 Spring Boot 整合 RabbitMQ 有了一定的瞭解。現在,我們再來看下 RabbitMQ 路由場景。

Configuration

在 RabbitMQConfig 中,我們註冊 佇列,轉發器,監聽等。

@Configuration
public class RabbitMQConfig2 {
 public static final String QUEUE_NAME = "spring-boot";
 public static final String QUEUE_EXCHANGE_NAME = "spring-boot-exchange";
 @Bean
 public Queue queue() {
 // 是否持久化
 boolean durable = true; 
 // 僅建立者可以使用的私有佇列,斷開後自動刪除
 boolean exclusive = false; 
 // 當所有消費客戶端連線斷開後,是否自動刪除佇列
 boolean autoDelete = false; 
 return new Queue(QUEUE_NAME, durable, exclusive, autoDelete);
 }
 @Bean
 public TopicExchange exchange() {
 // 是否持久化
 boolean durable = true;
 // 當所有消費客戶端連線斷開後,是否自動刪除佇列
 boolean autoDelete = false;
 return new TopicExchange(QUEUE_EXCHANGE_NAME, durable, autoDelete);
 }
 @Bean
 public Binding binding(Queue queue, TopicExchange exchange) {
 return BindingBuilder.bind(queue).to(exchange).with(QUEUE_NAME);
 }
 @Bean
 SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
 MessageListenerAdapter listenerAdapter) {
 SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
 container.setConnectionFactory(connectionFactory);
 container.setQueueNames(QUEUE_NAME);
 container.setMessageListener(listenerAdapter);
 return container;
 }
 @Bean
 MessageListenerAdapter listenerAdapter(Receiver receiver) {
 return new MessageListenerAdapter(receiver, "receiveMessage");
 }
}

訊息生產者

建立訊息生產者 Sender。通過注入 AmqpTemplate 介面的例項來實現訊息的傳送。

@Service
public class Sender {
 @Autowired
 private AmqpTemplate rabbitTemplate;
 public void send() {
 System.out.println("樑桂釗 傳送訊息...");
 rabbitTemplate.convertAndSend(RabbitMQConfig2.QUEUE_NAME, "你好, 樑桂釗!");
 } 
}

訊息消費者

建立訊息消費者 Receiver。通過 @RabbitListener 註解定義對佇列的監聽。

@Service
public class Receiver {
 public void receiveMessage(String message) {
 System.out.println("Received <" + message + ">");
 }
}

執行

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.lianggzone.springboot" })
public class RunMain {
 public static void main(String[] args) {
 SpringApplication.run(RunMain.class, args);
 }
}

單元測試

建立單元測試用例

public class RabbitMQTest {
 @Autowired
 private Sender sender;
 @Test
 public void send() throws Exception {
 sender.send();
 }
}

Java高架構師、分散式架構、高可擴充套件、高效能、高併發、效能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分散式專案實戰學習架構師視訊免費獲取架構群:854180697 群連結:https://jq.qq.com/?_wv=1027&k=5UwECNa

寫在最後:歡迎留言討論,加關注,持續更新!!!