图解
目标:
1. 生产者将消息发送到RabbitMQ
2. 消费者将消息从RabbitMQ中将消息取出
代码结构
1、maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、application.yml
修改为自己rabbitmq的配置,2个工程记得修改端口
server:
port: 8080
spring:
rabbitmq:
username: admin
password: admin
virtual-host: /
host: 192.168.xxx.xxx
port: 5672
3、生产者
创建交换机、队列并将交换机和队列进行绑定,可在RabbitMq web页面手动创建
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FanoutRabbitConfig {
//创建队列
@Bean
public Queue queue1() {
/**
* private final String name; 队列名字
* private final boolean durable; 是否持久化,默认false, 持久化会被存储到磁盘上
* private final boolean exclusive; 默认false,
* private final boolean autoDelete; 默认false,是否自动删除,当没有使用该队列时会删除队列
*/
//一般设置一下队列的持久化就好,其余两个就是默认false
return new Queue("fanout.query1.java", true);
}
@Bean
public Queue query2() {
return new Queue("fanout.query2.java", true);
}
// 创建交换机
@Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange("fanout-exChange-java");
}
// 绑定交换机和队列
@Bean
public Binding bindingQuery1() {
return BindingBuilder.bind(queue1()).to(fanoutExchange());
}
@Bean
public Binding bindingQuery2() {
return BindingBuilder.bind(query2()).to(fanoutExchange());
}
}
service层模拟数据
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class FanoutRabbitServcice {
@Autowired
private RabbitTemplate rabbitTemplate;
// 定义交换机
private String exChange = "fanout-exChange-java";
// 2: 路由key
private String routeKey = "";
public void sendManage(int num){
String massage = "这是第" + num + "条订单";
System.out.println(massage);
// 发送消息到RabbitMQ 注意:routeKey字段必须要写,不然消息发不到队列中
rabbitTemplate.convertAndSend(exChange, routeKey ,massage);
}
}
生产者测试数据
@SpringBootTest
class SpringbootRabbitmqFanoutProducerApplicationTests {
@Autowired
FanoutRabbitServcice fanoutRabbitServcice;
@Test
void contextLoads() throws InterruptedException {
for (int i = 0; i < 10; i++) {
Thread.sleep(1000);
fanoutRabbitServcice.sendManage(i);
}
}
}
4、消费者
生产者创建了2个队列,这里创建2个消费者进行测试
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "fanout.query1.java", autoDelete = "false"),
exchange = @Exchange(value = "fanout-exChange-java",type = ExchangeTypes.FANOUT)
))
@Component
public class ConsumerOne {
//RabbitHandler 代表此方法为接受消息的方法,不要有返回值
@RabbitHandler
public void messageRevice(String message){
System.out.println("获取fanout.query1.java中第"+message+"消息");
}
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "fanout.query2.java",autoDelete = "false"),
exchange = @Exchange(value = "fanout-exChange-java",type = ExchangeTypes.FANOUT)
))
@Component
public class ConsumerTwo {
@RabbitHandler
public void messageRevice(String message){
System.out.println("获取fanout.query2.java中第"+message+"消息");
}
}