rabbitmq实现

149 阅读1分钟

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("超时未签署自动取消 ->成功!");
        }
    }

}