栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

spring整和rabbitmq实现延迟队列

spring整和rabbitmq实现延迟队列

延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。
比如下订金后超过一定时间未付尾款,订单取消,库存回滚这样的情况,就需要用到延迟队列。

在rabbitmq中我们可以使用TTL(消息过期时间)+死信队列来实现延迟队列。

一、首先,新建一个maven信息生产者项目,导入相关依赖


    
        org.springframework
        spring-context
        5.1.7.RELEASE
    
    
        org.springframework.amqp
        spring-rabbit
        2.1.8.RELEASE
    
    
        junit
        junit
        4.12
    
    
        org.springframework
        spring-test
        5.1.7.RELEASE
    

1.1、 创建 spring-rabbitmq-producersrcmainresourcespropertiesrabbitmq.properties
连接参数等配置文件;
rabbitmq.host=192.168.220.12
rabbitmq.port=5672
rabbitmq.username=lxs
rabbitmq.password=lxs
rabbitmq.virtual-host=/xzk

1.2、 创建 spring-rabbitmq-producersrcmainresourcesspringspring-rabbitmq.xml 整合
配置文件;




    
    
    
    
    
    

    
    
        
        
            
            
            
            
            
            
        
    

    
        
            
        
    

    
    

    
        
            
        
    

1.3、创建一个测试类,发送消息

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/spring-rabbitmq.xml")
public class producerTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void queueTest2() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM--dd HH:ss");

        //1.发送订单消息。
        rabbitTemplate.convertAndSend("order_exchange", "order.msg",
                "订单信息:id=1,time="+sdf.format(new Date()));


    }

}

二、创建一个信息消费类,导入与生产类相同的依赖

2.1、同上面的1.1步骤,也是创建配置文件

2.2、信息消费类中创建 spring-rabbitmq-producersrcmainresourcesspringspring-rabbitmq.xml 整合配置文件



    
    

    
    

    
    
        
    

2.3、

创建上面定义的消息接收类

@Component
public class OrderListener implements ChannelAwareMessageListener {
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            //1.接收转换消息
            System.out.println(new String(message.getBody()));
            //2. 处理业务逻辑
            System.out.println("处理业务逻辑...");
            System.out.println("根据订单id查询其状态...");
            System.out.println("判断状态是否为支付成功");
            System.out.println("订单未支付,取消订单,回滚库存....");
            //3. 手动签收
            channel.basicAck(deliveryTag, true);
        } catch (Exception e) {
            //e.printStackTrace();
            System.out.println("出现异常,拒绝接受");
            //4.拒绝签收,不重回队列 requeue=false
            channel.basicNack(deliveryTag, true, false);
        }
    }
}

2.4、创建一个测试类方便启动

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/spring-rabbitmq.xml")
public class Consumer {

    @Test
    public void consumerTest(){
        while (true){

        }
    }
}

 三、先运行消息消费类,再运行消费生产类,十秒后我们才能接收到来自消息

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434060.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号