SpringBoot+RabbitMq延时队列实例

业务场景

根据访客预约的到访时间,延时下发人脸信息

条件

先安装Rabbitmq,在安装延时队列插件(死信交换机)

代码

配置文件(队列+交换机+RoutingKey)

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.62</version>
</dependency>
@Configuration
public class FaceDelayQueueConfig {
     

    public static final String FACE_QUEUE_DELAY = "face_delayed_queue";
    public static final String FACE_EXCHANGE_DELAY = "face_delayed_exchange";
    public static final String FACE_ROUTING_KEY_DELAY = "face_delayed_routing_key";

    @Bean
    public CustomExchange faceDelayExchange() {
     
        Map<String, Object> args = new HashMap<>();
        args.put("x-delayed-type", "direct");
        return new CustomExchange(FACE_EXCHANGE_DELAY, "x-delayed-message", true, false, args);
    }

    @Bean
    public Queue faceDelayQueue() {
     
        Queue queue = new Queue(FACE_QUEUE_DELAY, true);
        return queue;
    }

    @Bean
    public Binding faceDelayBinding() {
     
        return BindingBuilder.bind(faceDelayQueue()).to(faceDelayExchange()).with(FACE_ROUTING_KEY_DELAY).noargs();
    }
}

队列消息实体

public class FaceRabbitAddMessage implements Serializable {
     
    @ApiModelProperty("访客标识")
    private Integer visitorId;
    @ApiModelProperty("发送消息时间")
    private Date date;
    @ApiModelProperty("延迟时间(毫秒)")
    private Integer delayTime;
}

消息生产者

@Service
public class FaceRabbitMessageServiceImpl {
     
    private final static Logger logger = LoggerFactory.getLogger(FaceRabbitMessageServiceImpl.class);

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送延迟消息(人脸添加)
     *
     * @param faceRabbitMessage 消息
     */
    public void sendMsg(FaceRabbitAddMessage faceRabbitMessage) {
     
        logger.warn("VisitorFaceRabbitMessage:" + JSON.toJSONString(faceRabbitMessage));
        rabbitTemplate.convertAndSend(FaceDelayQueueConfig.FACE_EXCHANGE_DELAY, FaceDelayQueueConfig.FACE_ROUTING_KEY_DELAY, faceRabbitMessage, message -> {
     
            message.getMessageProperties().setDelay(faceRabbitMessage.getDelayTime() < 0 ? 0 : faceRabbitMessage.getDelayTime());
            return message;
        });
    }
}

消息消费者

@Component
@RabbitListener(queues = FaceDelayQueueConfig.FACE_QUEUE_DELAY)
public class FaceRabbitMessageReceiver {
     

    @Autowired
    private VisitorMapper visitorMapper;
    @Autowired
    private FaceService faceService;

    private final static Logger logger = LoggerFactory.getLogger(FaceRabbitMessageReceiver.class);

    /**
     * 接收延时消息(添加人脸)
     *
     * @param message
     */
    @RabbitHandler
    public void receiveMessage(FaceRabbitAddMessage message) {
     
        logger.warn("FaceRabbitAddMessage:" + JSONObject.toJSONString(message));
        //自定义逻辑

    }
}

你可能感兴趣的:(Java,java,rabbitmq,spring,boot)