(22.02.21)RabbitMQ_work模型Demo

90 阅读1分钟

RabbitMQ work模型Demo

启动RabbitMQ服务

  1. 启用管理工具

    image-20220216084413373

  2. 输入 rabbitmq-plugins enable rabbitmq_management 启动管理工具

    net stop RabbitMQ  // 停止
    net start RabbitMQ  // 启动
    
  3. 查看http://127.0.0.1:15672

    默认账号密码:guest/guest

  4. 创建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

image-20220221155011499

Properties只能设置指定的字段

image-20220221155128676

@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);
    }

多线程的消费者

  1. 编写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;
        }
    }
    
  2. 在消费者中使用自定义的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);
        }
    }