RocketMq方便测试,提供一个controller的接口,支持拉取消息,查看消息内容

通过一个REST API接口动态地启动RocketMQ的消费者,并基于传入的参数(topicNamefilterExpressionconsumerGroupId)决定要监听哪些消息。在Spring Boot项目中,这通常不是推荐的做法,因为消息消费者通常在应用启动时就配置好,并且持续运行,而不是被动态地创建和销毁。

不过,如果确实需要这样做,您可以考虑以下的设计思路:

方案概述

  • 创建一个服务,该服务能够根据传入的参数创建并管理RocketMQ消费者的实例。
  • 设计一个Controller,通过这个Controller接收到的参数来调用上述服务,动态启动消费者。
  • 由于这种设计涉及到动态管理和维护消费者实例,需要注意资源的释放和异常处理。

实现动态消费者管理服务

这个服务将负责根据参数创建和管理RocketMQ消费者实例。

import org.apache.rocketmq.client.apis.ClientException;
import org.apache.rocketmq.client.apis.consumer.PushConsumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Service
public class DynamicConsumerService {

    private final Map<String, PushConsumer> consumerMap = new ConcurrentHashMap<>();
    private final RocketMQConsumerService rocketMQConsumerService;

    @Autowired
    public DynamicConsumerService(RocketMQConsumerService rocketMQConsumerService) {
        this.rocketMQConsumerService = rocketMQConsumerService;
    }

    public void startConsumer(String topicName, String filterExpression, String consumerGroupId) throws ClientException {
        if (consumerMap.containsKey(consumerGroupId)) {
            // 可能需要考虑停止或重置已存在的消费者
            return;
        }

        PushConsumer consumer = rocketMQConsumerService.createConsumer(topicName, filterExpression, consumerGroupId);
        consumer.start();
        consumerMap.put(consumerGroupId, consumer);
    }

    // 停止并移除消费者
    public void stopConsumer(String consumerGroupId) {
        PushConsumer consumer = consumerMap.remove(consumerGroupId);
        if (consumer != null) {
            consumer.shutdown();
        }
    }
}

这里createConsumer方法需要在RocketMQConsumerService中实现,返回一个配置好的PushConsumer实例,这个方法的实现与之前的startConsumer方法类似,但不会自动启动消费者。

实现Controller

然后,实现一个Controller来处理REST API请求,根据请求参数动态启动和停止消费者。

import org.apache.rocketmq.client.apis.ClientException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/consumer")
public class DynamicConsumerController {

    private final DynamicConsumerService dynamicConsumerService;

    @Autowired
    public DynamicConsumerController(DynamicConsumerService dynamicConsumerService) {
        this.dynamicConsumerService = dynamicConsumerService;
    }

    @PostMapping("/start")
    public String startConsumer(@RequestParam String topicName,
                                @RequestParam String filterExpression,
                                @RequestParam String consumerGroupId) {
        try {
            dynamicConsumerService.startConsumer(topicName, filterExpression, consumerGroupId);
            return "Consumer started for group: " + consumerGroupId;
        } catch (ClientException e) {
            e.printStackTrace();
            return "Failed to start consumer: " + e.getMessage();
        }
    }

    @PostMapping("/stop")
    public String stopConsumer(@RequestParam String consumerGroupId) {
        dynamicConsumerService.stopConsumer(consumerGroupId);
        return "Consumer stopped for group: " + consumerGroupId;
    }
}

注意事项

  • 动态创建和管理消费者实例是一个复杂的操作,可能会引入资源泄露、消息丢失等风险,特别是在生产环境中。
  • 确保在消费者不再需要时正确地停止和释放资源。
  • 考虑到消费者的启动和停止可能影响消息的连续性,这种设计更适用于测试环境或具有特定生命周期管理需求的场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值