Mac&Ubuntu安装rocketMQ

记录一下安装rocketMQ遇到的坑,其实如果正常的机器,正常的电脑配置安装官网一点可以安装成功。关键是大家情况不同,就遇到了问题。

正常安装流程

前提条件

Java 1.8+
maven

官网步骤

wget https://archive.apache.org/dist/rocketmq/4.7.0/rocketmq-all-4.7.0-source-release.zip
unzip rocketmq-all-4.7.0-source-release.zip
cd rocketmq-all-4.7.0/
mvn -Prelease-all -DskipTests clean install -U
cd distribution/target/rocketmq-4.7.0/rocketmq-4.7.0

就是下载zip,解压,maven安装

Start Name Server

nohup sh bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

后台启动name server,然后确认是否正常启动,可以通过tail查看日志

Start Broker

nohup sh bin/mqbroker -n localhost:9876 &
tail -f ~/logs/rocketmqlogs/broker.log
The broker[%s, 172.30.30.233:10911] boot success...

启动broker,正常情况可以正常启动,但是我就遇到了死活启动不了,阿里云的学生机器配置属实不给力,并且只要一启动,服务器敲命令都卡,把内存耗完了。

遇到的坑

阿里云学生云主机安装

买了一年的阿里云学生云主机,想安装个rocketMQ试试,结果遇到的第一个坑是git clone不行,报404,也就是找不到github,然后ping github.com也不行,然后网上找解法,在https://site.ip138.com/www.github.com/
查找GitHub的IP地址,然后修改/etc/hosts下的文件,添加一行,手动解析域名。

140.82.112.4 github.com

第二个坑就是启动name server报错“ERROR: Please set the JAVA_HOME variable in your environment, We need java(x64)! !!”,原因是Java是通过apt-get安装的,没有设置JAVA_HOME,所以要先查询JAVA_HOME是什么?然后设置即可。如果你的是bash就在.bashrc如果是zsh就在.zshrc增加
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64。然后使之生效
source .zshrc 或者source .bashrc。
第三个坑就是上面说的无法启动broker,报错“rockermq broker killed”,原因就是学生云主机配置太低,内存不够,网上的解法是修改rockerMQ的bin下的
mqnamesrv.sh和mqbroker.sh,找到这两个文件的JAVA_OPT这一行修改一下。mqnamesrv.sh修改成
JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx256m -Xmn256m -XX:MetaspaceSize=1 28m -XX:MaxMetaspaceSize=320m"
runbroker.sh修改成JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m",如果还是启动不了就再把参数设置小一点。

MAC下安装遇到的坑

我Mac下的Java是下载包安装的,导致没有JAVA_HOME,所以又出现了上面的报错,解决方法一样,只是路径变了。export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home,还有一个问题就是我的maven是通过brew进行安装的,可能是当时没有设置JAVA_HOME导致安装了Java13,这个把我坑惨了,在进行mvn -Prelease-all -DskipTests clean install -U这一步的时候,一直报Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile (default-compile) on project rocketmq-logging: Compilation failure: Compilation failure: 不再支持源选项 6。请使用 7 或更高版本。原因就是Java版本太高了。解决办法就是设置JAVA_HOME为Java1.8的,然后maven默认就是变成Java1.8了,再进行安装就行了。
还有一个问题就是我使用了oh-my-zsh,这个设置的JAVA_HOME只对当前用户有效,当我sudo su进入超级用户就没有JAVA_HOME了,这个坑我好久。

云服务器远程连接问题

报错"INFO RocketmqRemoting - closeChannel: close the connection to remote address[] result: true"这个问题差不多坑了我一天,各种谷歌百度。在远程启动后,如果想让本地可以访问,需要对其进行设置,创建配置文件broker.conf

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1=xxx.xxx.xxx.xxx
brokerIP2=xxx.xxx.xxx.xxx
namesrvAddr=xxx.xxx.xxx:9876
autoCreateTopicEnable=true

其中xxx.xxx.xxx.xxx设置为云服务器的公网IP,然后启动broker的时候加上配置文件sh mqbroker -c broker.conf,然后这个时候还不算完,还是没法访问连不上,各种修改配置,就是不行,最后试了一下producer.setVipChannelEnabled(false);consumer.setVipChannelEnabled(false);可以了。还有一点就是要配置阿里云的安全组,开放9876和10911端口。最后上个测试通过的例子结束。

生产者

package com.imooc.luckymoney.rocketMQ.producer;

import org.apache.rocketmq.client.exception.MQBrokerException;
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.apache.rocketmq.remoting.exception.RemotingException;
import org.apache.rocketmq.remoting.protocol.RocketMQSerializable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;

/**
 * @Author: xiangyang
 * @Description: producer端发送同步消息
 * @Date: 2020/6/5
 */
public class SyncProducer {

    private static String mqUrl = "你的公网IP,也就是上面设置的xxx.xxx.xxx.xxx";

    private static String mqPort = "9876";


    public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
        DefaultMQProducer producer = new DefaultMQProducer("syncMQ");
        producer.setNamesrvAddr(mqUrl + ":" + mqPort);
        producer.setVipChannelEnabled(false);
        producer.start();

        for(int i=0; i<20; i++){
            Message msg = new Message("TopicTest",
                    "TagA",
                    ("Hello RocketMQ" + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
            SendResult sendResult = producer.send(msg);
            System.out.printf("%s%n", sendResult);
        }
        producer.shutdown();
    }
}

消费者

package com.imooc.luckymoney.rocketMQ.consumer;

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;

/**
 * @Author: xiangyang
 * @Description: 消费消息
 * @Date: 2020/6/5
 */
public class Consumer {

    private static String mqUrl = "你的公网IP,也就是上面设置的xxx.xxx.xxx.xxx";

    private static String mqPort = "9876";

    public static void main(String[] args) throws MQClientException {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerMQ");
        consumer.setNamesrvAddr(mqUrl + ":" + mqPort);
        consumer.setVipChannelEnabled(false);
        consumer.subscribe("TopicTest", "*");

        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) {
                System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
        System.out.println("Consumer Started.%n");
    }
}

此外还可以启动rocketmq-console进行可视化。官网都有,不在此赘述。安装与使用

参考资料

RocketMQ安装和启动管理
Quick Start
阿里云安装RocketMQ
Apache RocketMQ单机部署

你可能感兴趣的:(Mac&Ubuntu安装rocketMQ)