服务启动监听rocketMq消息

使用SmartLifecycle接口实现监听rocketMq消息

消费者基类,使用 SmartLifecycle 管理生命周期

/**
 * @Author 
 * @Date 2023/8/114:04
 * @CLassName AbstractMiddleRocketMqConsumer
 * @Description rocketmq消息父类
 */
@Slf4j
public abstract class AbstractMiddleRocketMqConsumer implements SmartLifecycle {

    @Value("${rocketmq.nameserver:172.40.240.181:9876}")
    private String nameserver;

    @Value("${rocketmq.tag:*}")
    private String tag;

    @Value("${rocketmq.enabled:false}")
    private boolean enabled;

    private DefaultMQPushConsumer consumer;

    private boolean isRunning = false;

    @Override
    public void start() {
        if (enabled) {
            initConsumer();
        } else {
            log.info("rocketmq不初始化");
        }

    }

    public void initConsumer() {
        log.info("初始化rocketmq消息,server=【{}】,topic=【{}】,group=【{}】,tag=【{}】", getNameServer(), getTopic(),
                getConsumerGroup(), getTag());
        consumer = new DefaultMQPushConsumer(getConsumerGroup());
        consumer.setNamesrvAddr(getNameServer());
        try {
            consumer.subscribe(getTopic(), getTag());
        } catch (MQClientException e) {
            log.error("topic=【{}】,消费者初始化异常,【{}】", getTopic(), e);
            throw new BusinessException("消费者初始化异常");
        }

        consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
            if (CollectionUtils.isEmpty(msgs)) {
                log.info("消息列表为空");
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
            for (MessageExt msg : msgs) {
                try {
                    handler(msg);
                } catch (Exception e) {
                    log.error("消息处理异常,【{}】", e);
                }
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });
        try {
            consumer.start();
        } catch (MQClientException e) {
            log.error("topic=【{}】,消费者初始化异常,【{}】", getTopic(), e);
            throw new BusinessException("消费者初始化启动异常");
        }
        isRunning = true;
    }


    @PreDestroy
    public void closeConsumer() {
        consumer.shutdown();
    }

    protected abstract void handler(MessageExt msg);

    protected String getTag() {
        return tag;
    }


    protected abstract String getTopic();

    /**
     * 服务名称
     */
    protected String getNameServer() {
        return nameserver;
    }

    /**
     * 获取分组信息
     */
    protected abstract String getConsumerGroup();

    @Override
    public void stop() {

    }

    @Override
    public boolean isRunning() {
        return isRunning;
    }

}

消费者实现类1 监听topic1的消息

/**
 * @Author 
 * @Date 2023/8/115:53
 * @CLassName PlanMsgConsumer
 * @Description 
 */
@Component
@Slf4j
public class DefectMsgRocketMqConsumer extends AbstractMiddleRocketMqConsumer {

    @Value("${rocketmq.topic:}")
    private String topic;

    @Value("${rocketmq.enabled:false}")
    private boolean enabled;

    @Value("${rocketmq.defectgroup:GID-defectgroup}")
    private String group;

    @Autowired
    private AddPatrolWorkTaskPublisher patrolWorkTaskPublisher;

    @Override
    protected void handler(MessageExt msg) {
        if (!enabled) {
            log.info("消费kafka消息开关关闭");
            return;
        }
        try {
            log.info("变更消息=【{}】", msg);
           //业务处理
        } catch (Exception e) {
            log.error("变更消息处理异常,【{}】", e);
        }

    }
    @Override
    protected String getConsumerGroup() {
        return group;
    }


    @Override
    protected String getTopic() {
        return topic;
    }

}

消费者实现类2 监听topic2的消息

/**
 * @Author 
 * @Date 2023/8/115:53
 * @CLassName PlanMsgConsumer
 * @Description
 */
@Component
@Slf4j
public class PlanMsgRocketMqConsumer extends AbstractMiddleRocketMqConsumer {

    @Value("${rocketmq.plantopic:}")
    private String topic;

    @Value("${rocketmq.enabled:false}")
    private boolean enabled;

    @Value("${rocketmq.plangroup:GID-plangroup}")
    private String group;


    @Autowired
    private AddPatrolWorkTaskPublisher patrolWorkTaskPublisher;


    @Override
    protected void handler(MessageExt msg) {
        if (!enabled) {
            log.info("消费kafka消息开关关闭");
            return;
        }
        log.info("变更消息=【{}】", msg);
        //业务处理
    }

    @Override
    protected String getConsumerGroup() {
        return group;
    }

    @Override
    protected String getTopic() {
        return topic;
    }

}


生产者

//生产者

 @Value("${rocketmq.nameserver:172.40.240.181:9876}")
    private String nameserver;


    @Value("${rocketmq.tag:*}")
    private String tag;

    @PostMapping("/test/sendRocketMq")
    MiddleResponse<String> sendRocketMq(@RequestBody TestMsgDTO testMsgDTO) throws MQClientException {
        DefaultMQProducer defaultMQProducer = new DefaultMQProducer(testMsgDTO.getGroup());
        defaultMQProducer.setNamesrvAddr(nameserver);
        defaultMQProducer.start();
        Message msg = new Message(testMsgDTO.getTopicName(), tag, testMsgDTO.getMsg().getBytes());
        try {
            defaultMQProducer.sendOneway(msg);
        } catch (RemotingException e) {
            log.error("rocketmq消息发送失败,【{}】", e);
        } catch (InterruptedException e) {
            log.error("rocketmq消息发送失败,【{}】", e);
        }
        return MiddleResponse.successResult("发送成功");
    }

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RocketMQ 提供了两个注解来控制监听器的开关: 1. `@RocketMQMessageListener` 注解的 `selectorExpression` 属性:可以通过设置该属性的值来控制监听器消费哪些消息。例如,设置 `selectorExpression = "tagA || tagB"` 表示只消费 tag 为 tagA 或 tagB 的消息,其他消息将被忽略。 2. `@RocketMQTransactionListener` 注解的 `transCheckListener` 属性:可以通过设置该属性的值来控制事务消息监听器的开关。如果该属性的值为空字符串(默认值),则事务消息监听器将被启用;如果该属性的值为任何非空字符串,则事务消息监听器将被禁用。 举个例子,如果我们想要开启一个只消费 tag 为 tagA 或 tagB 消息监听器,可以这样写: ```java @RocketMQMessageListener(topic = "test-topic", selectorExpression = "tagA || tagB") public class MyListener implements RocketMQListener<String> { @Override public void onMessage(String message) { // 处理消息的逻辑 } } ``` 如果我们想要禁用一个事务消息监听器,可以这样写: ```java @RocketMQTransactionListener(txProducerGroup = "my-transaction-group", transCheckListener = "disable") public class MyTransactionListener implements RocketMQLocalTransactionListener { @Override public RocketMQLocalTransactionState executeLocalTransaction(Message message, Object o) { // 执行本地事务的逻辑 } @Override public RocketMQLocalTransactionState checkLocalTransaction(MessageExt messageExt) { // 检查本地事务状态的逻辑 } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值