父工程pom依赖
在父工程demo_rabbitmq中引入依赖
<!--AMQP依赖,包含RabbitMQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
publisher实现
首先配置MQ地址,在publisher服务的application.yml中添加配置:
spring:
rabbitmq:
host: 192.168.31.100 # 主机名
port: 5672 # 端口
virtual-host: / # 虚拟主机
username: root # 用户名
password: 123456 # 密码
然后在publisher服务中编写测试类SpringAmqpTest,并利用RabbitTemplate实现消息发送:
@SpringBootTest
public class PublisherTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void send(){
for (int i = 0; i < 200; i++) {
rabbitTemplate.convertAndSend("mq.basic","呵呵"+i);
}
}
}
consumer实现
首先配置MQ地址,在consumer服务的application.yml中添加配置:
spring:
rabbitmq:
host: 192.168.31.100 # 主机名
port: 5672 # 端口
virtual-host: / # 虚拟主机
username: root # 用户名
password: 123456 # 密码
然后在consumer服务的 com.xja.listener 包中新建一个类SpringRabbitListener,代码如下:
@Component
public class BasicQueueListener {
@RabbitListener(queues = "mq.basic") //核心注解 监听mq.basic这个队列
public void receive1(String message) throws InterruptedException {
Thread.sleep(500);
System.out.println("接收message1 = " + message);
}
@RabbitListener(queues = "mq.basic") //核心注解 监听mq.basic这个队列
public void receive2(String message) throws InterruptedException {
Thread.sleep(500);
System.out.println("接收message2 = " + message);
}
@RabbitListener(queues = "mq.basic") //核心注解 监听mq.basic这个队列
public void receive3(String message) throws InterruptedException {
Thread.sleep(500);
System.out.println("接收message3 = " + message);
}
}
能者多劳
在spring中有一个简单的配置,可以解决这个问题。我们修改consumer服务的application.yml文件,
添加配置:
spring:
rabbitmq:
listener:
simple:
prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息 预先载入
总结
Work模型的使用:
- 多个消费者绑定到一个队列,同一条消息只会被一个消费者处理
- 通过设置prefetch来控制消费者预取的消息数量