暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

RocketMQ 基本使用

zxy Java 2017-04-08
234

介绍

RocketMQ是阿里巴巴自研的第三代分布式消息中间件。2016年11月,阿里将RocketMQ捐献给Apache软件基金会,正式成为孵化项目。阿里称会将其打造成顶级项目。

2017年2月20日,RocketMQ正式发布4.0版本,专家称新版本适用于电商领域,金融领域,大数据领域,兼有物联网领域的编程模型。


相关地址

  • Git地址:https://github.com/apache/incubator-rocketmq

  • 编译好的文件:https://rocketmq.incubator.apache.org/dowloading/releases/

  • 快速入门:https://rocketmq.incubator.apache.org/docs/quick-start/

  • 阿里的最新版本,支持windows:https://github.com/alibaba/RocketMQ/releases/download/v3.2.6/alibaba-rocketmq-3.2.6.tar.gz


小试牛刀

可通过自己下载源码编译或下载编译好的文件,地址见上。
假设是自己下载源码进行编译

下载源码并进行编译

> git clone https://github.com/apache/incubator-rocketmq.git
> cd incubator-rocketmq
> mvn clean package install -Prelease-all assembly:assembly -U
> cd target/apache-rocketmq-all/

Start Name Server

> nohup sh bin/mqnamesrv &> tailf nohup.out

Start Broker

> nohup sh bin/mqbroker -n localhost:9876 &> tailf nohup.out

注意
如果这里启动失败,看一下内存是否足够,可以看一下“runbroker.sh”这个文件,对应的修改参数,如下

JAVA_OPT="-server -Xms4g -Xmx4g -Xmn2g -XX:PermSize=128m -XX:MaxPermSize=320m"

测试发送与接收

 > export NAMESRV_ADDR=localhost:9876
 > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
 > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

关闭服务

> sh bin/mqshutdown broker> sh bin/mqshutdown namesrv

在Java项目中的使用

pom.xml

<properties>
    <rocketmq_ver>4.0.0-incubating</rocketmq_ver></properties><dependencies><dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>${rocketmq_ver}</version></dependency></dependencies>

生产者

import org.apache.rocketmq.client.producer.DefaultMQProducer;import org.apache.rocketmq.client.producer.SendResult;import org.apache.rocketmq.common.message.Message;public class Producer {    public static void main(String[] args) {
        DefaultMQProducer producer = new DefaultMQProducer("Producer");
        producer.setNamesrvAddr(Config.ADDR);        try {
            producer.start();
            Message msg = new Message("PushTopic", "push", "1", "Just for push1.".getBytes());
            SendResult result = producer.send(msg);
            System.out.println("id:" + result.getMsgId() + " result:" + result.getSendStatus());
            msg = new Message("PushTopic", "push", "2", "Just for push2.".getBytes());
            result = producer.send(msg);
            System.out.println("id:" + result.getMsgId() + " result:" + result.getSendStatus());
            msg = new Message("PushTopic", "pull", "1", "Just for pull.".getBytes());
            result = producer.send(msg);
            System.out.println("id:" + result.getMsgId() + " result:" + result.getSendStatus());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            producer.shutdown();
        }
    }
}

消费者

import java.util.List;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.common.consumer.ConsumeFromWhere;import org.apache.rocketmq.common.message.Message;import org.apache.rocketmq.common.message.MessageExt;public class Consumer {    public static void main(String[] args) {
        DefaultMQPushConsumer consumer =                new DefaultMQPushConsumer("PushConsumer");
        consumer.setNamesrvAddr(Config.ADDR);        try {            //订阅PushTopic下Tag为push的消息
            consumer.subscribe("PushTopic", "push");           /**
            * 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br>
            * 如果非第一次启动,那么按照上次消费的位置继续消费
            */
            consumer.setConsumeFromWhere(
                    ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
            consumer.registerMessageListener(                    new MessageListenerConcurrently() {                        public ConsumeConcurrentlyStatus consumeMessage(
                                List<MessageExt> msgs,
                                ConsumeConcurrentlyContext Context) {                            for (Message msg : msgs) {
                                System.out.println(new String(msg.getBody()) + ":" + msg.toString());
                            }                            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                        }
                    }
            );
            consumer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结果

id:C0A801663174723279CF77AF3C6E0000 result:SEND_OKid:C0A801663174723279CF77AF3C7B0001 result:SEND_OKid:C0A801663174723279CF77AF3C7D0002 result:SEND_OK
Just for push1.:MessageExt [queueId=2, storeSize=184, queueOffset=14, sysFlag=0, bornTimestamp=1490348772974, bornHost=/192.168.127.1:53238, storeTimestamp=1490348775615, storeHost=/192.168.127.128:10911, msgId=C0A87F8000002A9F000000000002EDE8, commitLogOffset=191976, bodyCRC=1396413800, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message [topic=PushTopic, flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=15, KEYS=1, CONSUME_START_TIME=1490348782880, UNIQ_KEY=C0A801663174723279CF77AF3C6E0000, WAIT=true, TAGS=push}, body=15]]Just for push2.:MessageExt [queueId=3, storeSize=184, queueOffset=14, sysFlag=0, bornTimestamp=1490348772987, bornHost=/192.168.127.1:53238, storeTimestamp=1490348775620, storeHost=/192.168.127.128:10911, msgId=C0A87F8000002A9F000000000002EEA0, commitLogOffset=192160, bodyCRC=2014758571, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message [topic=PushTopic, flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=15, KEYS=2, CONSUME_START_TIME=1490348782882, UNIQ_KEY=C0A801663174723279CF77AF3C7B0001, WAIT=true, TAGS=push}, body=15]]

参考

  • http://www.infoq.com/cn/news/2017/02/RocketMQ-future-idea

  • https://github.com/alibaba/RocketMQ/releases

  • https://rocketmq.incubator.apache.org/docs/quick-start/

  • http://pan.baidu.com/s/1bogcpgN


文章转载自zxy Java,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论