文章目录
应用结构
应用分基本和高级两部分, 从消费者到生产者都有做区分, advance:高级, base:基础
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>
<groupId>com.mrathena.middle.ware</groupId>
<artifactId>rabbit.mq.springboot</artifactId>
<version>1.0.0</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<!-- this is needed or IntelliJ gives junit.jar or junit-platform-launcher:1.3.2 not found errors -->
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yml
spring:
rabbitmq:
host: 116.62.162.48
port: 5672
username: mrathena
password: password
virtual-host: springboot
基础
定向模式
配置 RabbitMQConfig
package com.mrathena.rabbit.mq.configuration.base;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
public static final String EXCHANGE = "exchange-direct";
public static final String QUEUE = "queue";
@Bean
public Exchange exchange() {
return ExchangeBuilder.directExchange(EXCHANGE).durable(false).build();
}
@Bean
public Queue queue() {
return QueueBuilder.nonDurable(QUEUE).build();
}
@Bean
public Binding binding(@Qualifier("queue") Queue queue,
@Qualifier("exchange") Exchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("direct").noargs();
}
}
消费者 QueueListener
package com.mrathena.rabbit.mq.listener.base;
import com.mrathena.rabbit.mq.configuration.base.RabbitMQConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class QueueListener {
@RabbitListener(queues = RabbitMQConfig.QUEUE)
public void handle(Message message) {
log.info("{}", new String(message.getBody()));
}
}
生产者 ProducerTest
package com.mrathena.base;
import com.mrathena.rabbit.mq.Application;
import com.mrathena.rabbit.mq.configuration.base.RabbitMQConfig;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = {Application.class})
public class ProducerTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void test() {
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE, "direct", "direct");
}
}
高级特性
延时队列
配置 RabbitMQAdvanceConfig
package com.mrathena.rabbit.mq.configuration.advance;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQAdvanceConfig {
public static final String EXCHANGE_DELAY = "exchange-direct";
public static final String QUEUE_DELAY = "queue-delay";
public static final String QUEUE_TTL_TEN_SECONDS = "queue-ttl-10-seconds";
public static final String ROUTING_KEY_DELAY = "delay";
@Bean
public Exchange exchangeDelay() {
return ExchangeBuilder.directExchange(EXCHANGE_DELAY).durable(false).build();
}
@Bean
public Queue queueDelay() {
return QueueBuilder.nonDurable(QUEUE_DELAY).build();
}
@Bean
public Binding bindingDelay() {
return BindingBuilder.bind(queueDelay()).to(exchangeDelay()).with(ROUTING_KEY_DELAY).noargs();
}
@Bean
public Queue queueTtlTenSeconds() {
return QueueBuilder.nonDurable(QUEUE_TTL_TEN_SECONDS)
.ttl(10000).deadLetterExchange(EXCHANGE_DELAY).deadLetterRoutingKey(ROUTING_KEY_DELAY)
.build();
}
}
消费者 DelayListener
package com.mrathena.rabbit.mq.listener.advance;
import com.mrathena.rabbit.mq.configuration.advance.RabbitMQAdvanceConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class DelayListener {
@RabbitListener(queues = RabbitMQAdvanceConfig.QUEUE_DELAY)
public void handle(Message message) {
log.info("{}", new String(message.getBody()));
}
}
生产者 DelayQueueTest
package com.mrathena.advance;
import com.mrathena.rabbit.mq.Application;
import com.mrathena.rabbit.mq.configuration.advance.RabbitMQAdvanceConfig;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
@SpringBootTest(classes = {Application.class})
public class DelayQueueTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void test() {
rabbitTemplate.convertAndSend("", RabbitMQAdvanceConfig.QUEUE_TTL_TEN_SECONDS, "delay - " + LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")));
}
}