一、Linxu环境下部署
官网地址:http://rocketmq.apache.org/docs/quick-start/
前提条件:64bit JDK 1.8+
下载编译好的安装包:
https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip
Start Name Server
#前面nohup代表后台启动
nohup sh bin/mqnamesrv &
#查看启动日志
tail -f ~/logs/rocketmqlogs/namesrv.log
Start Broker
#前面nohup代表后台启动
nohup sh bin/mqbroker -n localhost:9876 &
#查看启动日志
tail -f ~/logs/rocketmqlogs/broker.log
二、错误原因解决思路
1、如果是linux虚拟机下修改runbroker.sh和runserver.sh文件中JVM参数,默认参数设置的内存比较大,rocketmq会启动不成功
runbroker.sh中
原配置:JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
修改为:JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx256m -Xmn256m"
runserver.sh中
原配置:JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
修改为:JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx256m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
2、连接不上broker,并出现RemotingConnectException: connect to <172.17.0.1:10911> failed
原因是:broker部署在虚拟机,并且虚拟双网卡,client无法正常连接服务端
解决: 在con/broker.conf配置文件中添加:
brokerIP1=服务器地址
namesrvAddr =服务器地址:9876 #(多个地址以;分隔)
启动broker才会生效
nohup sh bin/mqbroker -n 127.0.0.1:9876 -c ./conf/broker.conf &
3、No route info of this topic,不能自动创建topic
启动broker时添加autoCreateTopicEnable=true,代表自动创建topic
nohup sh bin/mqbroker -n 127.0.0.1:9876 autoCreateTopicEnable=true -c ./conf/broker.conf &
如果还不行,看下服务端版本号与客户端版本号是否一致,我现在用的版本号都是4.8.0
关闭broker和server语句
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
三、rocketmq控制台搭建
下载地址https://github.com/apache/rocketmq-externals,找到rocketmq-console工程,修改下application.properties文件中的rocketmq.config.namesrvAddr
把工程打成jar启动
java -jar D:\tools\rocketmq-console-ng-2.0.0.jar
四、消息接收和发送实例:
版本
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.8.0</version>
</dependency>
生产者:
package com.example.rocketmq.product;
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;
public class SyncProducer {
public static void main(String[] args) throws Exception {
//Instantiate with a producer group name.
DefaultMQProducer producer = new
DefaultMQProducer("please_rename_unique_group_name");
// Specify name server addresses.
producer.setNamesrvAddr("xx.xx.xx.xx:9876");
//Launch the instance.
producer.start();
for (int i = 0; i < 2; i++) {
//Create a message instance, specifying topic, tag and message body.
Message msg = new Message("TopicTest" /* Topic */,
"TagA" /* Tag */,
("Hello RocketMQ " +
i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
);
//Call send message to deliver message to one of brokers.
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
}
//Shut down once the producer instance is not longer in use.
producer.shutdown();
}
}
日志
SendResult [sendStatus=SEND_OK, msgId=C0A8014F1B4418B4AAC221280DCD0000, offsetMsgId=C0A8198100002A9F00000000000052D6, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=9], queueOffset=8]
SendResult [sendStatus=SEND_OK, msgId=C0A8014F1B4418B4AAC221280E000001, offsetMsgId=C0A8198100002A9F000000000000539F, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=10], queueOffset=7]
消费者:
package com.example.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;
public class Consumer {
public static void main(String[] args) throws InterruptedException, MQClientException, MQClientException {
// Instantiate with specified consumer group name.
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name");
// Specify name server addresses.
consumer.setNamesrvAddr("xx.xx.xx.xx:9876");
// Subscribe one more more topics to consume.
consumer.subscribe("TopicTest", "*");
// Register callback to execute on arrival of messages fetched from brokers.
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(), new String(msgs.get(0).getBody()));
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//Launch the consumer instance.
consumer.start();
System.out.printf("Consumer Started.%n");
}
}
日志
Consumer Started.
ConsumeMessageThread_1 Receive New Messages: Hello RocketMQ 1
ConsumeMessageThread_2 Receive New Messages: Hello RocketMQ 0