【MQ-02】基于SpringBoot的RocketMQ简单Demo(附源码)

源码

  • 生产者:https://github.com/HelloSummer5/RocketMQProducerDemo
  • 消费者:https://github.com/HelloSummer5/RocketMQConsumerDemo
  • 运行本Demo的前提是RocketMQ已经启动,详情参考RocketMQ的安装

官方文档

  • 在csdn或者度娘search走两天弯路不如好好看看官方文档,以下是基于官方文档出的Demo。
  • RocketMQ作为国产骄傲,支持下。
    http://rocketmq.apache.org/docs/quick-start/

Maven依赖

<dependency>
        <groupId>org.apache.rocketmqgroupId>
        <artifactId>rocketmq-clientartifactId>
        <version>4.3.0version>
dependency>

开发生产者Producer

  • 在此为了方便查看效果,生产者消费者是分开两个项目的。
package com.example.demo.service;

import io.netty.util.internal.ThreadExecutorMap;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * 生产者
 */
@Service
public class ProducerService {

    /**
     * 初始化
     */
    public static void main(String[] args) throws Exception {
        // 创建一个带组名的生产者实例
        DefaultMQProducer producer = new
                DefaultMQProducer("please_rename_unique_group_name");
        // 指定MQ服务ID地址/域名
        producer.setNamesrvAddr("localhost:9876");
        // 启动生产者实例
        producer.start();
        for (int i = 0; i < 10; i++) {
            // 创建消息实例, 指定topic, tag和消息体.
            Message msg = new Message("TopicTest",
                    "TagA",
                    ("Hello RocketMQ " +
                            i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
            );
            // 调用发送消息方法来传递消息到其中一个broker
            SendResult sendResult = producer.send(msg);
//                System.out.printf("%s%n", sendResult);
            System.out.printf("发送消息的ID:%s, ---发送消息的状态:%s%n", sendResult.getMsgId(), sendResult.getSendStatus());
        }
        // 不常使用的话,关闭生产者实例
        producer.shutdown();
    }

}

消费者

package com.example.demo.servcie;

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.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.List;

/**
 * 消费者
 */
@Service
public class ConsumerService {

    public static void main(String[] args) throws MQClientException {
        // 创建一个带组名的消费者实例
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name");

        // 指定MQ服务IP地址/域名
        consumer.setNamesrvAddr("localhost:9876");

        // 为消费者订阅一个或多个topics
        consumer.subscribe("TopicTest", "*");

        // 从broker拿到的消息之后执行的方法,do sth.
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                            ConsumeConcurrentlyContext context) {
//                System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                for (MessageExt msg: msgs ) {
                        System.out.println("收到消息:" + new String(msg.getBody()));
                    }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });

        // 启动消费者实例
        consumer.start();

        System.out.printf("消费者已准备就绪.%n");
    }

}

运行

  • 先启动消费者,再启动生产者。

消费者

【MQ-02】基于SpringBoot的RocketMQ简单Demo(附源码)_第1张图片

生产者

【MQ-02】基于SpringBoot的RocketMQ简单Demo(附源码)_第2张图片

启动生产者之后的消费者

【MQ-02】基于SpringBoot的RocketMQ简单Demo(附源码)_第3张图片

你可能感兴趣的:(Java,MQ)