RabbitMQ+springboot用延迟插件实现延迟消息的发送

延迟队列:其实就是死信队列中消息过期的特殊情况

延迟队列应用场景:

在这里插入图片描述
可以用死信队列来实现,不过死信队列要等上一个消息消费成功,才会进行下一个消息的消费,这时候就需要用到延迟插件了,不过要线在docker上装一个插件

安装过程(Linux【Docker】)

前置条件是在Docker中部署过RabbitMq。

1、打开你的远程工具,首先查看docker中已有的容器,主要是为了查看rabbitmq的容器ID

2、将本地下载好的压缩包传到服务器某文件夹下,然后将其复制到Docker中的RabbitMq容器中的plugins文件夹下。

docker cp /home/rabbitmq_delayed_message_exchange-3.8.0.ez a687ef46141b:/plugins

3、进入容器查看该目录下是否有该压缩包。

进入容器命令:(通过容器号或者容器名)

docker exec -it a687ef46141b bash

4、同样在容器中的命令行执行一下命令添加插件。

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

5、退出容器,重启该容器。

6、在管理端即同样可以看到新增了一种交换机模式。

总结:以上就是RabbitMQ的延迟插件的安装过程!

基于插件的延迟队列DEMO

成功安装RabbitMQ的延迟插件之后,我们就可以尝试写一个延迟队列来验证一下是否可以解决上述问题。

首先我们的测试环境是在一个Springboot的框架下完成!

1、最先写配置类

/**
 * 定义延迟交换机
 */
@Configuration
public class RabbitMQDelayedConfig {
    //队列
    private static final String DELAYQUEUE = "delayedqueue";
    //交换机
    private static final String DELAYEXCHANGE = "delayedExchange";
    @Bean
    public Queue delayqueue(){return new Queue(DELAYQUEUE);}
    //自定义延迟交换机
    @Bean
    public CustomExchange delayedExchange(){
        Map<String, Object> arguments = new HashMap<>();
        arguments.put("x-delayed-type","direct");
        /**
         * 1、交换机名称
         * 2、交换机类型
         * 3、是否需要持久化
         * 4、是否需要自动删除
         * 5、其他参数
         */
        return new CustomExchange(DELAYEXCHANGE,"x-delayed-message",true,false,arguments);
    }
    //绑定队列和延迟交换机
    @Bean
    public Binding delaybinding(){
        return BindingBuilder.bind(delayqueue()).to(delayedExchange()).with("sectest").noargs();
    }
}

2、先写生产者

/**
 * 基于插件的延迟队列
 * 消息生产者
 */
@Service
@Slf4j
public class DelayMQSender {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendmsg(String message,Integer delaytime){
        log.info("当前时间:{},发送时长{}信息给延迟队列:{}",new Date().toString(),delaytime,message);
        rabbitTemplate.convertAndSend("delayedExchange","sectest",message,msg->{
            //设置发送消息的延长时间 单位:ms
            msg.getMessageProperties().setDelay(delaytime);
            return msg;
        });
    }
}

3、再写消费者

/**
 * 基于插件的延迟队列
 * 消息的消费者
 */
@Service
@Slf4j
public class DelayMQReceiver {
    @RabbitListener(queues = "delayedqueue")
    public void receivemsg(Message messages){
        String msg = new String(messages.getBody());
        log.info("当前时间:{},接收时长信息给延迟队列:{}",new Date().toString(),msg);
    }
}

4、进行测试

将模拟请求放在了一个简易的网页上,点击后输出如下结果,证明当先发送了20s延时的消息,再发送2s延时的消息,在2s后消息正常被消费,基于插件的延迟队列完美解决了问题。

**【思考】:**如果在实际业务场景中使用延迟队列的话,那就需要服务端在消息被消费之后主动告诉前端消费的结果,如果是这样的话,那么Ajxs的通信方式是单双工通信,只能前端主动访问后端并返回结果,后端无法主动发送消息,应该使用Websocket来进行通信才可,websocket是长连接,不同于http的短连接,可以实现全双工通信,前后端都可以主动发送消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用RabbitMQSpring Boot和WebSocket来实现前端可发送和接收消息的功能。下面是一个基本的实现步骤: 1. 首先,确保您的Spring Boot项目中已经添加了RabbitMQ和WebSocket的依赖。 2. 在Spring Boot应用程序中配置RabbitMQ,包括连接配置和队列配置。您可以使用`@Configuration`注解创建一个配置类,并使用`@Bean`注解创建一个`ConnectionFactory`和一个`RabbitTemplate`实例。 3. 创建一个消息接收器(Consumer)来监听RabbitMQ队列中的消息。您可以使用`@RabbitListener`注解将一个方法标记为消息接收器,并指定要监听的队列名称。 4. 在Spring Boot应用程序中配置WebSocket,包括处理器和拦截器等。您可以使用`@Configuration`注解创建一个配置类,并使用`@Bean`注解创建一个`WebSocketHandler`和一个`HandshakeInterceptor`实例。 5. 创建一个WebSocket处理器(Handler)来处理前端发送消息。您可以实现`WebSocketHandler`接口,并重写相应的方法来处理连接、消息发送和关闭等事件。 6. 在WebSocket处理器中,您可以使用RabbitTemplate将接收到的消息发送RabbitMQ队列中。您可以在处理器的`handleTextMessage()`方法中调用RabbitTemplate的相关方法来发送消息。 7. 在前端页面中,使用JavaScript或其他框架来建立WebSocket连接,并发送和接收消息。您可以使用WebSocket的API来发送和接收消息,并在接收到消息时更新页面内容。 通过以上步骤,您可以实现前端可发送和接收消息的功能。当前端发送消息时,WebSocket处理器会接收到消息并将其发送RabbitMQ队列中。然后,消息接收器会监听该队列,并将消息发送给其他需要接收该消息的客户端。这样,前端页面就可以实现实时的消息发送和接收功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值