业务场景
根据访客预约的到访时间,延时下发人脸信息
条件
先安装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));
//自定义逻辑
}
}