1.搭建步骤
官方文档已经写的十分详细了。这里我记录一下自己的操作步骤。
- 进入RocketMQ的官网(http://rocketmq.apache.org/),并点击Documentation
- 首先看到的是QuickStart这一节,之后我们就照着文档,在windows上搭建起环境
- 启动步骤记录
①下载RocketMQ的zip包,下面是直接的下载链接(其他版本,修改版本号即可下载)
https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip
https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.3.0/rocketmq-all-4.3.0-bin-release.zip
②将下载后的包放入一个纯英文的目录下,并解压
③配置环境变量
④启动name server
执行 .\mqnamesrv.cmd
⑤启动broker server
同④一样在bin目录下输入 cmd
进入dos命令行。
执行 .\mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true
- 可是化控制台的使用
①在git上下载控制台源码(是一个springboot程序)这里我们已经将源码打成了jar包。可以问作者要
②将jar包下载到本地window上
③启动jar包
java -jar rocketmq-console-ng-1.0.0.jar --server.port 8080
④浏览器访问localhost:8080(如果自己在启动命令指定了port,访问自己port就好)
2.使用java程序进行消息生产(坑、坑、坑)
- 官方文档中,搭建完环境后,就是撸码呗,我们最终目的就是用java代码生产消费消息
- 来到官方的simple Example
①导入jar包
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.0</version>
</dependency>
②新建一个类写个main方法(官方的2.1的代码复制过来呗,没啥问题吧)
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("localhost:9876");
//Launch the instance.
producer.start();
for (int i = 0; i < 100; 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();
}
}
- 执行(run 一把呗)
很遗憾你会报下面的错误,怎么办?复制错误百度呗。
- 百度的结果
ok,你会搜到下面的文章,然后你配置后,对不起依旧报错。然后你可能会看到评论区有人说4.7.1还是错,引导你错误的质疑是版本问题。然而都不是。
- 解决方法
在官方的这段代码中,在使用生产者对象发送消息时,没有设置超时时间,默认的超时时间太短了。??不知道我说的是什么?? 简单的说就是执行下面这段代码,你会得到正确结果
@Test
public void testSendSyncMessage() throws Exception{
//Instantiate with a producer group name.
DefaultMQProducer producer = new
DefaultMQProducer("please_rename_unique_group_name");
// Specify name server addresses.
producer.setNamesrvAddr("localhost:9876");
//Launch the instance.
producer.start();
for (int i = 0; i < 100; 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,40000);
System.out.printf("%s%n", sendResult);
}
//Shut down once the producer instance is not longer in use.
producer.shutdown();
}
没错看看 第 18行。。 就是设置个 请求时间的问题 。。唉心累
3.关于Broker启动
在1中已经记录了RocketMQ的启动流程。在启动Broker时我们是通过命令行的方式指定了一些配置:指定自动创建Topic,指定NameServer
本节主要是想通过配置文件的方式指定去启动Broker。
如何指定配置文件
在官方Dledger集群搭建和集群管理中都隐约的点出了如何使用配置文件。那就是通过-c
来指定配置文件文件路径即可
.\mqbroker.cmd -n localhost:9876 -c ..\conf\broker.conf
-n:此参数也可以在配置文件中指定 -c:指定配置文件,在配置文件中指定 autoCreateTopicEnable=true 等价于命令行中指定
Broker配置文件项
Broker配置文件的配置项在官方文档最佳实践中提到
配置项 | 默认值 | 说明 |
---|---|---|
autoCreateTopicEnable | true(4.9) | 是否自动创建Topic |
namesrvAddr | localhost:9876 | 指定NameServer地址,多个用逗号隔开 |
brokerName | 无 | broker的名称 |
brokerClusterName | 无 | Broker所在的集群名称 |
brokerId | 0 | 0:Master,>1:Slave |
storePathRootDir | $HOME/store/ | 存储根路径 |
brokerRole | ASYNC_MASTER | broker角色:SYNC_MASTER/ASYNC_MASTER/SLAVE |
flushDiskType | ASYNC_FLUSH | 刷盘策略:SYNC_FLUSH/ASYNC_FLUSH |
提供一份我的配置文件:
autoCreateTopicEnable = true
namesrvAddr = localhost:9876
brokerClusterName = GxCluster
brokerName = broker-gx
brokerId = 0
storePathRootDir = E:\\studyProcess\\rocketmq\\rocketmq-all-4.9.3-bin-release\\rocketmq-4.9.3\\store
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
提供我最终的启动命令
.\bin\mqbroker.cmd -c .\conf\broker.conf