RocketMQ的开发使用

版权声明:有不正确的地方,还望各位指正指导,Thanks! https://blog.csdn.net/a544258023/article/details/83057970

简介

       RocketMQ是一款低延迟、高可靠、可伸缩、易于使用的消息中间件。支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型,支持拉(pull)和推(push)两种消息模式等特性。

安装与服务

1. 下载安装包(如:rocketmq-all-4.3.1-bin-release.zip)

      https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.3.1/

2. 解压

     >unzip rocketmq-all-4.3.1-bin-release.zip 

3. 启动nameserver

     >cd rocketmq-all-4.3.1-bin-release

     >nohup sh bin/mqnamesrv &

4. 启动broker

     >nohup sh bin/broker -n localhost:9876 &

5. 停止服务

    >sh bin/mqshutdown broker

消息生产者

       生产者的作用就是将消息发送到 MQ,生产者本身既可以产生消息,如读取文本信息等。也可以对外提供接口,由外部应用来调用接口,再由生产者将收到的消息发送到 MQ。

在编写程序的时候需要注意以下几个参数:

Producer Group : 生产者组就是多个发送同一类消息的生产者称之为一个生产者组

Topic : 消息逻辑分类,比如订单类、库存类的消息

Name Server :  路由信息,通信的地址及端口号

Tag : 标签是topic的进一步细化

Key : 消息的唯一键值,业务上可以通过key查找消息

Message : 消息载体,主要用于存储实际数据

消息消费者

    消费 MQ 上的消息的应用程序就是消费者,至于消息是否进行逻辑处理,还是直接存储到数据库等取决于业务需要。

Consumer Group : 消费者组,和生产者类似,消费同一类消息的多个 consumer 实例组成一个消费者组。

生产者、消费者Demo

maven

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

RocketMQProducerHelper.java

import org.apache.log4j.Logger;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;

import java.util.List;

public class RocketMQProducerHelper {

    private static Logger LOG = Logger.getLogger(RocketMQProducerHelper.class);

    private static String topic;
    private static RocketMQProducerHelper instance = null;
    private DefaultMQProducer producer;

    private RocketMQProducerHelper(String nameServer, String topicName, String groupID) {
        try {
            if (nameServer != null && topicName != null && groupID != null) {
                topic = topicName;
                producer = new DefaultMQProducer(groupID);
                producer.setRetryTimesWhenSendFailed(4);
                producer.setRetryAnotherBrokerWhenNotStoreOK(true);
                producer.setNamesrvAddr(nameServer);
                producer.start();
                LOG.info("producer started...");
            } else {
                LOG.error("parameter init error");
                throw new Exception("parameter init error");
            }
        } catch (Exception e) {
            LOG.error("producer init error...");
            throw new RuntimeException(e);
        }
    }

    public static RocketMQProducerHelper getInstance(String nameServer, String topic, String groupID) {
        if(instance == null) {
            synchronized (RocketMQProducerHelper.class) {
                if (instance == null) {
                    instance = new RocketMQProducerHelper(nameServer, topic, groupID);
                }
            }
        }
        return instance;
    }

    public SendResult send(byte[] data) {
        return send(topic, null, null, data, null);
    }

    public SendResult send(String tag, byte[] data) {
        return send(topic, tag, null, data, null);
    }

    public SendResult send(String tag, String key, byte[] data) {
        return send(topic, tag, key, data, null);
    }

    public SendResult send(String topic, String tag, String key, byte[] data, final MessageQueueSelector selector) {
        SendResult sendResult = null;
        try {
            Message msg;
            if (tag == null || tag.length() == 0) {
                msg = new Message(topic, data);
            } else if (key == null || key.length() == 0) {
                msg = new Message(topic, tag, data);
            } else {
                msg = new Message(topic, tag, key, data);
            }
            if (selector != null) {
                sendResult = producer.send(msg, new MessageQueueSelector() {
                    public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
                        return selector.select(mqs, msg, arg);
                    }
                }, key);
            } else {
                sendResult = producer.send(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
            LOG.error("Send message error");
        }
        return sendResult;
    }
}

1.  生产者Producer

public class Producer {
    public static void main(String[] args) {

        String nameServer = "localhost:9876";
        String topic = "test";
        String groupID = "groupid";
        String tag = "TAG";
        RocketMQProducerHelper producer = RocketMQProducerHelper.getInstance(nameServer, topic, groupID);
        for (int i=0; i<10; i++) {
            String key = "1000"+i;
            String value = "value="+i;
            producer.send(tag, key, value.getBytes());
        }
    }
}

2. 消费者Consumer

import org.apache.hadoop.hbase.util.Bytes;
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 java.util.List;

public class Consumer {

    public static void main(String[] args) throws MQClientException {

        String nameServer = "localhost:9876";
        String groupID = "groupid";
        String topic = "test";

        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(groupID);
        consumer.setNamesrvAddr(nameServer);
        consumer.subscribe(topic, "*");
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                            ConsumeConcurrentlyContext context) {
                for(MessageExt msg : msgs) {
                    String result = Bytes.toString(msg.getBody());
                    System.out.println("--------------------msg="+result);
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
    }
}

猜你喜欢

转载自blog.csdn.net/a544258023/article/details/83057970
今日推荐