RabbitMQ work模型Demo
启动RabbitMQ服务
-
启用管理工具
-
输入
rabbitmq-plugins enable rabbitmq_management
启动管理工具net stop RabbitMQ // 停止 net start RabbitMQ // 启动
-
查看
http://127.0.0.1:15672
默认账号密码:
guest
/guest
-
创建
user
vhost(虚拟主机)
队列
项目中使用RabbitMQ
引入依赖
<!--RabbitMQ依赖-->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>
配置RabbitMQ连接信息
# RabbitMQ
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=test
spring.rabbitmq.password=123456
spring.rabbitmq.virtual-host=onlinedevice
生产者
生产者生产消息可分为3个部分,分别为Header
Properties
payload
Properties只能设置指定的字段
@Service
public class OnlinedeviceProducer implements Runnable{
@Autowired
public RabbitTemplate rabbitTemplate; // 创建RabbitTemplate对象
String payload = "testPayload" // 负载
public void onlinedeviceProducer() throws InterruptedException {
MessageProperties messageProperties = new MessageProperties();
messageProperties.setType("Login"); // 设置Properties
Message message = new Message(payload.getBytes(StandardCharsets.UTF_8),messageProperties);
// 简单情况下,routingKey即为队列名
rabbitTemplate.convertAndSend("q_deviceonline",message); // 发送的消息带有Properties
rabbitTemplate.convertAndSend("work",payLoad); // 只有payload
}
}
消费者
单线程消费者
// 简单消费者,绑定队列即可
@RabbitListener(queues = "work")
public void testWorkConsumer2(String payload){
System.out.println(payload);
}
多线程的消费者
-
编写RabbitMQ配置类
@Configuration public class RabbitMQConfig { // 获取在配置文件中定义的最大和当前线程数 @Value("${spring.currentConsumers}") public int currentConsumers; @Value("${spring.maxConsumers}") public int maxConsumers; // 配置批量监听容器 @Bean("customContainerFactory") public SimpleRabbitListenerContainerFactory containerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConcurrentConsumers(currentConsumers); //设置线程数 factory.setMaxConcurrentConsumers(maxConsumers); //设置最大线程数 configurer.configure(factory, connectionFactory); return factory; } }
-
在消费者中使用自定义的ContainerFactory
@RabbitListener(queues = "test.devOnlineStatus", containerFactory = "customContainerFactory") public void receiverData1(String data, Message message) throws ParseException { String deviceAction = message.getMessageProperties().getType(); System.out.println(deviceAction); System.out.println(data); } }