美文网首页
Mac&Ubuntu安装rocketMQ

Mac&Ubuntu安装rocketMQ

作者: 小白小白啦 | 来源:发表于2020-06-06 10:22 被阅读0次

    记录一下安装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<MessageExt> 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

          本文链接:https://www.haomeiwen.com/subject/uqpttktx.html