RocketMQ安装

来源:互联网 发布:淘宝店铺免费营销工具 编辑:程序博客网 时间:2024/04/28 20:24

RocketMQ简单安装

下载

1.直接下载安装包:https://github.com/alibaba/RocketMQ/releases
下载alibaba-rocketmq-3.2.6.tar.gz版本

$ tar -xvf alibaba-rocketmq-3.2.6.tar.gz$ cd alibaba-rocketmq

2.下载源码打包安装 :https://github.com/alibaba/RocketMQ
解压后执行打包命令:

 $ mvn -Dmaven.test.skip=true clean package install assembly:assembly -U

会自动生成target目录,即安装包

部署

进入bin目录:
1. 启动nameserver

$ nohup sh namesrv &

查看nohup.out是否显示success
2. 启动broker

$ nohup sh mqbroker -n "192.168.2.2:9876" &

注:-n 表示指定nameserver地址
查看broker日志,如下:

The broker[sztest14, 192.168.2.3:10911] boot success. and name server
is 192.168.2.2:9876

即发现brokerip不是本机,因此需要修改,如下:

$ sh mqbroker -m > broker.p$ vim broker.p(修改brokerIP1为本机)$ nohup sh mqbroker -c broker.p &

此时即完成MQ单机部署

java demo实例

  • 创建maven项目,pom.xml如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.catt</groupId>    <artifactId>RocketMQTest</artifactId>    <version>0.0.1-SNAPSHOT</version>    <packaging>jar</packaging>    <name>RocketMQTest</name>    <url>http://maven.apache.org</url>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    </properties>    <dependencies>        <dependency>            <groupId>com.alibaba.rocketmq</groupId>            <artifactId>rocketmq-client</artifactId>            <version>3.2.6</version>        </dependency>        <dependency>            <groupId>com.alibaba.rocketmq</groupId>            <artifactId>rocketmq-all</artifactId>            <version>3.2.6</version>            <type>pom</type>        </dependency>        <dependency>            <groupId>ch.qos.logback</groupId>            <artifactId>logback-classic</artifactId>            <version>1.1.1</version>        </dependency>        <dependency>            <groupId>ch.qos.logback</groupId>            <artifactId>logback-core</artifactId>            <version>1.1.1</version>        </dependency>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.10</version>            <scope>test</scope>        </dependency>    </dependencies></project>
  • 生产者
import java.util.concurrent.TimeUnit;import com.alibaba.rocketmq.client.exception.MQClientException;import com.alibaba.rocketmq.client.producer.DefaultMQProducer;import com.alibaba.rocketmq.client.producer.SendResult;import com.alibaba.rocketmq.common.message.Message;public class Producer {    public static void main(String[] args) throws MQClientException,            InterruptedException {        /**         * 一个应用创建一个Producer,由应用来维护此对象,可以设置为全局对象或者单例<br>         * 注意:ProducerGroupName需要由应用来保证唯一<br>         * ProducerGroup这个概念发送普通的消息时,作用不大,但是发送分布式事务消息时,比较关键,         * 因为服务器会回查这个Group下的任意一个Producer         */        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");        producer.setNamesrvAddr("192.168.2.2:9876");        producer.setInstanceName("Producer");        /**         * Producer对象在使用之前必须要调用start初始化,初始化一次即可<br>         * 注意:切记不可以在每次发送消息时,都调用start方法         */        producer.start();        /**         * 下面这段代码表明一个Producer对象可以发送多个topic,多个tag的消息。         * 注意:send方法是同步调用,只要不抛异常就标识成功。但是发送成功也可会有多种状态,<br>         * 例如消息写入Master成功,但是Slave不成功,这种情况消息属于成功,但是对于个别应用如果对消息可靠性要求极高,<br>         * 需要对这种情况做处理。另外,消息可能会存在发送失败的情况,失败重试由应用来处理。         */        for (int i = 0; i < 100; i++) {            try {                {                    Message msg = new Message("TopicTest1",// topic                            "TagA",// tag                            "OrderID001",// key                            ("Hello RocketMQ").getBytes());// body                    SendResult sendResult = producer.send(msg);                    System.out.println(sendResult);                }                {                    Message msg = new Message("TopicTest2",// topic                            "TagB",// tag                            "OrderID0034",// key                            ("Hello RocketMQ").getBytes());// body                    SendResult sendResult = producer.send(msg);                    System.out.println(sendResult);                }                {                    Message msg = new Message("TopicTest3",// topic                            "TagC",// tag                            "OrderID061",// key                            ("Hello RocketMQ").getBytes());// body                    SendResult sendResult = producer.send(msg);                    System.out.println(sendResult);                }            } catch (Exception e) {                e.printStackTrace();            }            TimeUnit.MILLISECONDS.sleep(1000);        }        /**         * 应用退出时,要调用shutdown来清理资源,关闭网络连接,从RocketMQ服务器上注销自己         * 注意:我们建议应用在JBOSS、Tomcat等容器的退出钩子里调用shutdown方法         */        producer.shutdown();    }}
  • 消费者
import java.util.List;import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;import com.alibaba.rocketmq.client.exception.MQClientException;import com.alibaba.rocketmq.common.message.MessageExt;public class PushConsumer {    /**     * 当前例子是PushConsumer用法,使用方式给用户感觉是消息从RocketMQ服务器推到了应用客户端。<br>     * 但是实际PushConsumer内部是使用长轮询Pull方式从RocketMQ服务器拉消息,然后再回调用户Listener方法<br>     */    public static void main(String[] args) throws InterruptedException,            MQClientException {        /**         * 一个应用创建一个Consumer,由应用来维护此对象,可以设置为全局对象或者单例<br>         * 注意:ConsumerGroupName需要由应用来保证唯一         */        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(                "ConsumerGroupName");        consumer.setNamesrvAddr("192.168.2.2:9876");        consumer.setInstanceName("Consumber");        /**         * 订阅指定topic下tags分别等于TagA或TagC或TagD         */        consumer.subscribe("TopicTest1", "TagA || TagC || TagD");        /**         * 订阅指定topic下所有消息<br>         * 注意:一个consumer对象可以订阅多个topic         */        consumer.subscribe("TopicTest2", "*");        consumer.registerMessageListener(new MessageListenerConcurrently() {            /**             * 默认msgs里只有一条消息,可以通过设置consumeMessageBatchMaxSize参数来批量接收消息             */            @Override            public ConsumeConcurrentlyStatus consumeMessage(                    List<MessageExt> msgs, ConsumeConcurrentlyContext context) {                System.out.println(Thread.currentThread().getName()                        + " Receive New Messages: " + msgs.size());                MessageExt msg = msgs.get(0);                if (msg.getTopic().equals("TopicTest1")) {                    // 执行TopicTest1的消费逻辑                    if (msg.getTags() != null && msg.getTags().equals("TagA")) {                        // 执行TagA的消费                        System.out.println(new String(msg.getBody()));                    } else if (msg.getTags() != null                            && msg.getTags().equals("TagC")) {                        // 执行TagC的消费                    } else if (msg.getTags() != null                            && msg.getTags().equals("TagD")) {                        // 执行TagD的消费                    }                } else if (msg.getTopic().equals("TopicTest2")) {                    System.out.println(new String(msg.getBody()));                }                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;            }        });        /**         * Consumer对象在使用之前必须要调用start初始化,初始化一次即可<br>         */        consumer.start();        System.out.println("Consumer Started.");    }    }
0 0