springBoot接入rocketMq削峰处理请求

#生产环境修改记录接口频繁调用导致服务器负载高#

一、引入jar包

 <!-- rocketmq 2.2.3-->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.2.3</version>
        </dependency>

二、application.yml 中配置mq连接信息

# rocketmq config
rocketmq:
  name-server: 127.0.0.1:9876
  consumer:
    access-key: username
    secret-key: password
  producer:
    group: xxx
    access-key: username
    secret-key: password

三、创建生产者代码

其中MqConst中的topic、tag常量信息自己定义

package com.beego.web.mq.producer;

import com.beego.model.vo.course.SavePptRecordVo;
import com.beego.web.mq.constant.MqConst;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.apache.rocketmq.spring.support.RocketMQHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component;
import java.util.Objects;

/**
 * 保存(视频&直播)播放记录生产者
 *
 * @author zsf
 */
@Component
@Slf4j
@AllArgsConstructor
@EnableAsync
public class SavePlayRecordProduce {
    private final RocketMQTemplate rocketMqTemplate;

    @Async
    public void sendMessage(SavePptRecordVo savePptRecordVo) {
        log.info("发送保存(视频&直播)播放记录:{}", savePptRecordVo);
        if (Objects.nonNull(savePptRecordVo)) {
            rocketMqTemplate.syncSend(MqConst.TOPIC_GOLD_BEEGO_STUDENT+":"+MqConst.TAG_VIDEO_SAVEPPTRECORD,
                MessageBuilder.withPayload(savePptRecordVo).setHeader(RocketMQHeaders.KEYS, savePptRecordVo.getRecordId()).build());
        }

    }

}

四、创建消费者代码

其中MqConst中的topic、tag常量信息自己定义

package com.beego.web.mq.consume;

import com.beego.model.vo.course.SavePptRecordVo;
import com.beego.web.course.service.IDmSpecialTypeService;
import com.beego.web.mq.constant.MqConst;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.apache.rocketmq.spring.core.RocketMQPushConsumerLifecycleListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author zsf
 */
@Slf4j
@Component
@RequiredArgsConstructor
@RocketMQMessageListener(consumerGroup = MqConst.GROUP_GOLD_BEEGO_STUDENT+MqConst.TAG_VIDEO_SAVEPPTRECORD,
    topic = MqConst.TOPIC_GOLD_BEEGO_STUDENT, selectorExpression = MqConst.TAG_VIDEO_SAVEPPTRECORD)
public class SavePlayRecordConsumer implements RocketMQListener<SavePptRecordVo>, RocketMQPushConsumerLifecycleListener {
    @Autowired
    private IDmSpecialTypeService dmSpecialTypeService;

    @Override
    public void onMessage(SavePptRecordVo savePptRecordVo) {
        log.info("接收保存(视频&直播)播放记录:{}", savePptRecordVo);
        dmSpecialTypeService.savePlayRecordMq(savePptRecordVo);
    }

    @Override
    public void prepareStart(DefaultMQPushConsumer consumer) {
        // 每次拉取的间隔,单位为毫秒
        consumer.setPullInterval(1000);
        // 设置每次从队列中拉取的消息数为16 (线上环境10个Broker 默认每个Broker4个队列 则 10*4*8=320 每秒拉取处理320个消息)
        consumer.setPullBatchSize(8);
    }

}

五、serviceImpl中发送消息

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
如果你想要在 Spring Boot 应用中异步发送 RocketMQ 消息,你可以使用 RocketMQ 的异步发送方式。具体来说,你可以通过使用 `org.apache.rocketmq.client.producer.SendCallback` 接口中的 `onSuccess` 和 `onException` 方法异步发送消息,并在消息发送成功或发送失败时接收返回结果。 下面是一个简单的示例代码,演示了如何在 Spring Boot 应用中异步发送 RocketMQ 消息并接收返回结果: ```java @Component public class RocketMQProducer { @Autowired private DefaultMQProducer producer; public void sendAsyncMessage(String topic, String message) throws Exception { Message msg = new Message(topic, message.getBytes(Charset.forName("UTF-8"))); producer.send(msg, new SendCallback() { @Override public void onSuccess(SendResult sendResult) { System.out.printf("Message send success, result=%s%n", sendResult); } @Override public void onException(Throwable e) { System.out.printf("Message send failed, error=%s%n", e.getMessage()); } }); } } ``` 在上面的代码中,我们通过 `DefaultMQProducer` 发送了一条 RocketMQ 消息,并通过 `SendCallback` 接口中的 `onSuccess` 和 `onException` 方法异步接收返回结果。你可以在 `onSuccess` 方法中处理消息发送成功的逻辑,在 `onException` 方法中处理消息发送失败的逻辑。 在你需要接收 RocketMQ 消息的地方,你可以使用 RocketMQ 提供的消费者客户端接收消息。你可以使用 `org.apache.rocketmq.client.consumer.DefaultMQPushConsumer` 类来创建一个消费者实例,并通过 `registerMessageListener` 方法注册一个消息监听器来接收消息。 下面是一个简单的示例代码,演示了如何在 Spring Boot 应用中接收 RocketMQ 消息: ```java @Component public class RocketMQConsumer { @Autowired private RocketMQProperties rocketMQProperties; @PostConstruct public void init() throws Exception { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(rocketMQProperties.getConsumerGroup()); consumer.setNamesrvAddr(rocketMQProperties.getNameServer()); consumer.subscribe(rocketMQProperties.getTopic(), "*"); consumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { for (MessageExt msg : msgs) { System.out.printf("Received message: %s%n", new String(msg.getBody())); } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer.start(); } } ``` 在上面的代码中,我们通过 `DefaultMQPushConsumer` 创建了一个 RocketMQ 消费者实例,并通过 `subscribe` 方法订阅了一个主题。我们还注册了一个消息监听器,在消息到达时可以通过 `consumeMessage` 方法接收消息。在 `consumeMessage` 方法中,你可以处理接收到的消息,并返回一个 `ConsumeConcurrentlyStatus` 类型的状态码来告诉 RocketMQ 消费者是否成功消费了该消息。 希望这个简单的示例代码能够帮助你在 Spring Boot 应用中异步发送和接收 RocketMQ 消息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值