1、pom文件添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、rabbitmq配置文件
server.port=29080
spring.rabbitmq.host=192.168.32.136
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.listener.direct.acknowledge-mode=auto
# 消费消息自动删除
spring.rabbitmq.listener.simple.acknowledge-mode=auto
3、消息实体类
package com.example.testa.entity;
import java.io.Serializable;
public class FaceRabbitAddMessage implements Serializable {
private Integer visitorId;
private String date;
//延时发送时间 毫秒
private Integer delayTime;
public Integer getVisitorId() {
return visitorId;
}
public void setVisitorId(Integer visitorId) {
this.visitorId = visitorId;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public Integer getDelayTime() {
return delayTime;
}
public void setDelayTime(Integer delayTime) {
this.delayTime = delayTime;
}
}
4、Rabbitmq配置类
package com.example.testa.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@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();
}
}
5、延时消息发送实现
package com.example.testa.service;
import com.example.testa.config.FaceDelayQueueConfig;
import com.example.testa.entity.FaceRabbitAddMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 消息生产者
*/
@Service
public class FaceRabbitMessageServiceImpl {
private final static Logger logger = LoggerFactory.getLogger(FaceRabbitMessageServiceImpl.class);
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 发送延迟消息(人脸添加)
*
* @param faceRabbitMessage 消息
*/
public void sendMsg(FaceRabbitAddMessage 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;
});
}
}
6、消息消费
package com.example.testa.service;
import com.example.testa.config.FaceDelayQueueConfig;
import com.example.testa.entity.FaceRabbitAddMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(queues = FaceDelayQueueConfig.FACE_QUEUE_DELAY)
public class FaceRabbitMessageReceiver {
private final static Logger logger = LoggerFactory.getLogger(FaceRabbitMessageReceiver.class);
/**
* 接收延时消息(添加人脸)
*
* @param message
*/
@RabbitHandler
public void receiveMessage(FaceRabbitAddMessage message) {
System.out.println(message.getDelayTime());
}
}
、
7、延时消息生产接口
package com.example.testa.web;
import com.example.testa.entity.FaceRabbitAddMessage;
import com.example.testa.service.FaceRabbitMessageServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* @Description TODO
* @Date 2020/11/21 22:41
* @Author zsj
*/
@RestController
public class TestController {
@Autowired
FaceRabbitMessageServiceImpl faceRabbitMessageService;
@RequestMapping("/create")
public ResponseResult<FaceRabbitAddMessage> create(int time) {
FaceRabbitAddMessage message = new FaceRabbitAddMessage();
message.setDate("2020-"+time);
message.setVisitorId(time);
message.setDelayTime(time * 1000);
faceRabbitMessageService.sendMsg(message);
return ResponseResult.dataSuccess(message, "22");
}
}