1.配置pom:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.配置文件,rabbitmq的安装地址,端口,用户名,密码
spring:
rabbitmq:
host: 123.57.93.132
username: gds
password: bff2019@ZW..
port: 5672
3.rabbitmq配置类:
package com.ebaiyihui.service.referral.server.rabbitmq;
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;
/**
* RabbitConfig
*
* @DESCREPTION:
* @Author: zhanghaojie
* @Date: 2018/12/15下午6:14
*/
@Configuration
public class RabbitMqConfig {
//队列名
public final static String DELAYED_QUEUE_NAME = "referral.delayed.order";
//交换机名
public final static String EXCHANGE_NAME = "referral_delayed_exchange";
//路由健:消息到交换机 交换机发消息到队列,具体哪个队列,通过路由健绑定
public final static String DELAY_ORDER_ROUTING_KEY = "referral_delay_order_routing_key";
//定义队列
@Bean
public Queue queue() {
return new Queue(DELAYED_QUEUE_NAME);
}
// 配置默认的交换机
@Bean
CustomExchange customExchange() {
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
//参数二为类型:必须是x-delayed-message
return new CustomExchange(EXCHANGE_NAME, "x-delayed-message", true, false, args);
}
// 通过路由键绑定队列到交换器
@Bean
Binding binding() {
return BindingBuilder.bind(queue()).to(customExchange()).with(DELAY_ORDER_ROUTING_KEY).noargs();
}
}
4.生产消息到队列:
@Slf4j
public class RabbitMqUtils {
public static final int ORDER_TIME_OUT_TIME = 1000 * 60 * 30;
public static void senderDelayedOrderOutTradeNo(RabbitTemplate rabbitTemplate, String rabbitMqDelayedOrderVoStr) {
rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_NAME, RabbitMqConfig.DELAY_ORDER_ROUTING_KEY, rabbitMqDelayedOrderVoStr, message -> {
//30分钟超时
message.getMessageProperties().setHeader("x-delay", ORDER_TIME_OUT_TIME);
log.info("send message to rabbitmq: " + rabbitMqDelayedOrderVoStr);
log.info("rabbitmq return message is:{}",message);
return message;
});
}
}
5.生产应用添加消息到队列:
Long id = referralOrderEntity.getId();
//存消息中间件
RabbitMqUtils.senderDelayedOrderOutTradeNo(rabbitTemplate, JSON.toJSONString(id));
6.消费信息:
@Component
@Slf4j
public class DelayedRefferalOrderReceiver {
@Autowired
private ReferralOrderService referralOrderService;
//监听该消息队列,监听到有消息时及时处理
@RabbitListener(queues = RabbitMqConfig.DELAYED_QUEUE_NAME)
@RabbitHandler
public void process(String id) {
log.info("Fetch referral info from rabbit mq: " + id);
ReferralOrderEntity referralOrderEntity = referralOrderService.getById(Long.parseLong(id));
if(null == referralOrderEntity){
log.info("Fetch referral info from rabbit mq:->查询转诊单为空");
return;
}
if(ReferralStatusEnum.TO_BE_SIGNED.getValue() == referralOrderEntity.getReferralStatus()){
log.info("超时未签署自动取消 ->"+id);
referralOrderEntity.setReferralStatus(ReferralStatusEnum.ALREADY_CANCEL.getValue());
referralOrderEntity.setUpdateTime(new Date());
referralOrderService.update(referralOrderEntity);
log.info("超时未签署自动取消 ->成功!");
}
}
}