RocketMQ在springboot的用法

1.从官网下载对应的二进制文件,直接解压即可使用

对应官网下载地址为 :Downloading the Apache RocketMQ Releases - Apache RocketMQhttps://rocketmq.apache.org/dowloading/releases/

2.启动(window中启动命令)

1)启动namesrv

.\bin\mqnamesrv.cmd  

2)  启动broker

.\bin\mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true

对于broker启动不成功,可以尝试以下方法

C:/Users/用户名/store,将这个目录和目录下所有文件全部删除,然后再输入broker的启动命令

3.pom文件引入依赖

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.9.1</version>
</dependency>

4.生产者和消费者相关代码

rocketmq.name.server.address=127.0.0.1:9876
public class RocketMQConstant {

    public static final String GROUP_MOMENTS = "GroupMoments" ;

    public static final String TOPIC_MOMENTS = "TopicMoments" ;

}

对应业务的生产者,和处理实际业务的消费者 

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.MessageExt;
import org.example.bilili.constant.RocketMQConstant;
import org.example.bilili.domain.Goods;
import org.example.bilili.websocket.WebSocketService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import javax.websocket.Session;
import java.util.List;

@Configuration
public class RocketMQConfig {

    private static final Logger log = LoggerFactory.getLogger(RocketMQConfig.class);

    @Value("${rocketmq.name.server.address}")
    private String nameServerAddr;

    @Resource(name = "stringRedisTemplate")
    private StringRedisTemplate redisTemplate ;

    @Bean("momentsProducer")
    public DefaultMQProducer momentsProducer() throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer(RocketMQConstant.GROUP_MOMENTS);
        producer.setNamesrvAddr(nameServerAddr);
        producer.start();
        return producer;
    }

    @Bean("momentsConsumer")
    public DefaultMQPushConsumer momentsConsumer() throws Exception {
        log.info("in momentsConsumer....");
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(RocketMQConstant.GROUP_MOMENTS);
        consumer.setNamesrvAddr(nameServerAddr);
//        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        consumer.subscribe(RocketMQConstant.TOPIC_MOMENTS,"*");
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                log.info("consumeMessage....:{}",list.size());
                for (MessageExt messageExt : list) {
                    String bodyStr = new String(messageExt.getBody());

                    Goods goods = JSONObject.parseObject(bodyStr, Goods.class);
                    Integer goodsId = goods.getId();
                    String key = "subscribed-" + String.valueOf(goodsId);
                    String goodsJsonStr  =  JSON.toJSONString(goods) ;
                    log.info("goods....:{}",goodsJsonStr);

                    String subscribedListStr = redisTemplate.opsForValue().get(key);
                    if(StringUtils.isEmpty(subscribedListStr)){
                        redisTemplate.opsForValue().set(key, goodsJsonStr);
                    }
                }
//                for(MessageExt msg:list){
//                    log.info("MessageExt:{}", JSONObject.toJSONString(msg));
//                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
        return consumer;
    }

}

同步发送和异步发送 

public class RocketMQUtil {

    private static final Logger log = LoggerFactory.getLogger(RocketMQUtil.class);

    /**
     * 同步发送
     * @param producer
     * @param msg
     * @throws Exception
     */
    public static void syncSendMsg(DefaultMQProducer producer, Message msg) throws Exception{
        SendResult result = producer.send(msg);
        log.info("sync send msg:{}", JSON.toJSONString(result));
    }

    /**
     * 异步发送
     * @param producer
     * @param msg
     * @throws Exception
     */
    public static void asyncSendMsgReal(DefaultMQProducer producer, Message msg) throws Exception{
        producer.send(msg, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                log.info("send rocket mq success:{}",sendResult.getMsgId());
            }

            @Override
            public void onException(Throwable throwable) {
                log.info("send rocket mq exception:{}",throwable.getMessage(),throwable);
            }
        });
    }

    /**
     * 异步发送 发送多次 messageCount为发送次数
     * @param producer
     * @param msg
     * @throws Exception
     */
    public static void asyncSendMsg(DefaultMQProducer producer, Message msg) throws Exception{
        int messageCount = 2 ;//定义发送次数
        CountDownLatch2 countDownLatch2 = new CountDownLatch2(messageCount);
        for(int i=0;i<messageCount;i++){
            producer.send(msg, new SendCallback() {
                @Override
                public void onSuccess(SendResult sendResult) {
                    log.info("send rocket mq success:{}",sendResult.getMsgId());
                    countDownLatch2.countDown();
                }

                @Override
                public void onException(Throwable throwable) {
                    log.info("send rocket mq exception:{}",throwable.getMessage(),throwable);
                    countDownLatch2.countDown();
                }
            });
//            countDownLatch2.await(5, TimeUnit.SECONDS);
        }
    }
}

测试发送 

import com.alibaba.fastjson.JSONObject;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.example.bilili.constant.RocketMQConstant;
import org.example.bilili.domain.Goods;
import org.example.bilili.util.RocketMQUtil;
import org.example.bilili.vo.CommonResponse;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.Date;

@RestController
@RequestMapping("/rocket-mq")
public class RocketMQController {

    @Resource
    private ApplicationContext applicationContext ;

    @GetMapping("/send-sync-mq")
    public CommonResponse<String> sendMQTest() throws Exception{
        Goods goods = new Goods();
        goods.setId(1001);
        goods.setCreateTime(new Date());
        goods.setUpdateTime(new Date());
        goods.setGoodsName("苹果11");
        goods.setPrice(new BigDecimal("4999.9"));
        goods.setSupply(100);
        DefaultMQProducer defaultMQProducer = (DefaultMQProducer)applicationContext.getBean("momentsProducer");
        Message msg = new Message(RocketMQConstant.TOPIC_MOMENTS, JSONObject.toJSONString(goods).getBytes(StandardCharsets.UTF_8));
        RocketMQUtil.syncSendMsg(defaultMQProducer,msg);
        return CommonResponse.success();
    }

    @GetMapping("/send-async-mq")
    public CommonResponse<String> sendMQTest2() throws Exception{
        Goods goods = new Goods();
        goods.setId(1002);
        goods.setCreateTime(new Date());
        goods.setUpdateTime(new Date());
        goods.setGoodsName("苹果12");
        goods.setPrice(new BigDecimal("5999.9"));
        goods.setSupply(100);
        DefaultMQProducer defaultMQProducer = (DefaultMQProducer)applicationContext.getBean("momentsProducer");
        Message msg = new Message(RocketMQConstant.TOPIC_MOMENTS, JSONObject.toJSONString(goods).getBytes(StandardCharsets.UTF_8));
        RocketMQUtil.asyncSendMsg(defaultMQProducer,msg);
        return CommonResponse.success();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RocketMQ和Spring Boot的整合可以通过使用RocketMQ的Spring Boot Starter来实现。下面是整合的步骤: 1. 引入RocketMQ的Spring Boot Starter依赖。在你的Spring Boot项目的`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency> ``` 2. 配置RocketMQ的相关属性。可以在`application.properties`(或者`application.yml`)文件中配置RocketMQ的相关属性,例如: ```properties # NameServer的地址,多个地址使用逗号分隔 rocketmq.name-server=127.0.0.1:9876 # 消费者组名 rocketmq.consumer.group=my-consumer-group # 生产者组名 rocketmq.producer.group=my-producer-group ``` 3. 创建RocketMQ的生产者。使用`@EnableRocketMQ`注解开启RocketMQ支持,并创建一个生产者实例。例如: ```java import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyProducer { @Autowired private RocketMQTemplate rocketMQTemplate; public void sendMessage(String topic, String message) { rocketMQTemplate.convertAndSend(topic, message); } } ``` 4. 创建RocketMQ的消费者。使用`@RocketMQMessageListener`注解创建一个消费者实例,并指定要监听的主题和消费逻辑。例如: ```java import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; import org.springframework.stereotype.Component; @Component @RocketMQMessageListener(topic = "my-topic", consumerGroup = "my-consumer-group") public class MyConsumer implements RocketMQListener<String> { @Override public void onMessage(String message) { System.out.println("Received message: " + message); // 处理消息的业务逻辑 } } ``` 5. 使用RocketMQ的生产者发送消息。在需要发送消息的地方注入生产者实例,并调用`sendMessage`方法发送消息。例如: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class MyC

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值