记录一下安装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单机部署