RocketMQ 单机搭建以及使用(一)

RocketMQ官方文档:Simple Message Example - Apache RocketMQ

RocketMQ4.3监控平台:RocketMQ4.3监控平台(基于双master模式)_jessDL的博客-CSDN博客,到原文看看,支持正版!!!

1、下载二进制压缩包

Downloading the Apache RocketMQ Releases - Apache RocketMQ

解压之后:

2、配置环境变量

ROCKETMQ_HOME=E:\rocketMq\rocketmq-all-4.3.0-bin-release

然后再配置PATH (;%ROCKETMQ_HOME%\bin;)

3、启动RocketMQ

先启动namesrv,然后启动broker,进入rocketmq-all-4.3.0-bin-release\bin目录下,双击mqnamesrv.cmd

看到:The Name Server boot success. serializeType=JSON,namesrv启动成功!

执行命令:mqbroker.cmd -n localhost:9876

看到:The broker[DESKTOP-2ACCV2S, 172.17.56.5:10911] boot success. serializeType=JSON and name server is localhost:9876  broker启动成功!

因为内存分配问题导致启动失败:

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 8589934592 bytes for committing reserved memory.

解决办法:修改runserver.cmd和runbroker.cmd默认的内存大小

4、停止服务

记得cd到安装包的bin目录下!!!

停止nameserv:mqshutdown.cmd namesrv

停止broker:mqshutdown.cmd broker

Linux环境下搭建RocketMQ步骤和window环境下一样,因为我的阿里云主机内存大小,玩不起来,没法演示!!

5、RocketMQ简单使用

a、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>rocketMqDemo</groupId>
    <artifactId>rocketMqDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
            <dependency>
                <groupId>org.apache.rocketmq</groupId>
                <artifactId>rocketmq-client</artifactId>
                <version>4.3.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.rocketmq</groupId>
                <artifactId>rocketmq-common</artifactId>
                <version>4.3.0</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.4</version>
            </dependency>
        </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

b、RocketMqProducer

package com.cn.dl;

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.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by yanshao on 2019/3/8.
 */
public class RocketMqProducer {

    //消费组
    private static String producerGroup = "rocketMQProducer";
    //RocketMq server 地址,多个地址之间用分号分割:192.0.0.1:9876;192.0.0.2:9876
    private static String namesrvAddr = "127.0.0.1:9876";
    //消息主题
    private static String topic = "userOrder";
    //消息类型
    private static String tag = "order";

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

        try {
            DefaultMQProducer producer = new DefaultMQProducer(producerGroup);
            producer.setNamesrvAddr(namesrvAddr);
            producer.start();

            List<Order> orderList =  buildOrders();

            for (int i = 0; i < orderList.size(); i++) {

                String body = "订单信息 >>> " + orderList.get(i);
                //封装消息
                Message message = new Message(topic, tag, "KEY" + i, body.getBytes());

                SendResult sendResult = producer.send(message, new MessageQueueSelector() {
                    @Override
                    public MessageQueue select(List<MessageQueue> mqs, Message meg, Object arg) {
                        Long id = (Long) arg;
                        long index = id % mqs.size();
                        return mqs.get((int)index);
                    }
                    // TODO: 2019/3/8 要保证消息顺序不混乱,必须在生产时将消息push到同一个队列即可
                }, 0L);

                System.out.println("producer >>> " + body+" ,发送状态 >>> " + sendResult.getSendStatus());
            }
            producer.shutdown();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static List<Order> buildOrders() {
        List<Order> orderList = new ArrayList<Order>();
        String[] productName = new String[]{
        "Apple iPhone XS Max (A2104) 256GB",
        "HUAWEI Mate 20",
        "三星 Galaxy S10 8GB+512GB",
        "荣耀 8X",
        "小米 9",
        "小米Mix3",
        "荣耀 V20"};

        for(int i = 0; i < 7; i++){
            Order order = Order.builder()
                    .orderNo(UUID.randomUUID().toString().replace("-",""))
                    .productName(productName[new Random().nextInt(7)])
                    .unitPrice(new BigDecimal((new Random().nextInt(10) + 1) * 1000))
                    .createDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))
                    .build();
            orderList.add(order);
        }
        return orderList;
    }
}

c、RocketMqConsumer

package com.cn.dl;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.List;

/**
 * Created by yanshao on 2019/3/8.
 */
public class RocketMqConsumer {
    private static String customerGroup = "rocketMQCustomer";
    private static String namesrvAddr = "127.0.0.1:9876";
    private static String topic = "userOrder";
    private static String tag = "order";

    public static void main(String[] args) throws MQClientException {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(customerGroup);
        consumer.setNamesrvAddr(namesrvAddr);

        // TODO: 2019/3/8 这里可以设置消费消息的位置
        /**
         * CONSUME_FROM_FIRST_OFFSET
         * CONSUME_FROM_LAST_OFFSET
         * 同时会记录消息消息的offset
         * */
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        // TODO: 2019/3/8  subExpression 还可以这样写
        /**
         * tag >>>  "order || repay"
         * */
        consumer.subscribe(topic, tag);

        consumer.registerMessageListener(new MessageListenerOrderly() {
            @Override
            public ConsumeOrderlyStatus consumeMessage(List<MessageExt> messageExts, ConsumeOrderlyContext context) {
                context.setAutoCommit(true);

                for (MessageExt messageExt: messageExts) {
                    System.out.println("consumer >>> " + new String(messageExt.getBody()));
                }

                return ConsumeOrderlyStatus.SUCCESS;
            }
        });
        consumer.start();
        System.out.println("开始消费消息!!!");
    }


}

运行结果:

producer >>> 订单信息 >>> Order(orderNo=60f0e1e5eacc48d28a44fc9f274322a0, productName=HUAWEI Mate 20, unitPrice=3000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=3c6506fd46bb4d3eace60b02439d0dfa, productName=小米Mix3, unitPrice=2000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=0ed7948810a94a6d9d3e3ca61a581cff, productName=HUAWEI Mate 20, unitPrice=7000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=0ae85c62c16d474d93becfe6af6b07c1, productName=三星 Galaxy S10 8GB+512GB, unitPrice=9000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=cdcbc85331b34d98a4f310b98ec27eb6, productName=三星 Galaxy S10 8GB+512GB, unitPrice=3000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=105c81148f5c4d7a97819fe13a9217e4, productName=三星 Galaxy S10 8GB+512GB, unitPrice=2000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=cea55884ec714a45a7b0936b234b188b, productName=Apple iPhone XS Max (A2104) 256GB, unitPrice=6000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
consumer >>> 订单信息 >>> Order(orderNo=60f0e1e5eacc48d28a44fc9f274322a0, productName=HUAWEI Mate 20, unitPrice=3000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=3c6506fd46bb4d3eace60b02439d0dfa, productName=小米Mix3, unitPrice=2000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=0ed7948810a94a6d9d3e3ca61a581cff, productName=HUAWEI Mate 20, unitPrice=7000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=0ae85c62c16d474d93becfe6af6b07c1, productName=三星 Galaxy S10 8GB+512GB, unitPrice=9000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=cdcbc85331b34d98a4f310b98ec27eb6, productName=三星 Galaxy S10 8GB+512GB, unitPrice=3000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=105c81148f5c4d7a97819fe13a9217e4, productName=三星 Galaxy S10 8GB+512GB, unitPrice=2000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=cea55884ec714a45a7b0936b234b188b, productName=Apple iPhone XS Max (A2104) 256GB, unitPrice=6000, createDate=2019-03-08 15:53:43)

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燕少༒江湖

给我一份鼓励!谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值