rocketMq4.3.0版本的安装配置及使用
闲话不多说,直接进入正题。看下面:
一、下载安装
官网地址http://rocketmq.apache.org/release_notes/release-notes-4.3.0/,点击Resource后的链接地址就可以下载了。下载后放到/usr/local路径下,如下图所示:
进入到rocketmq-all-4.3.0/distribution/target/apache-rocketmq/bin如下路径,先来跟我一起修改两个配置文件。打开runserver.sh这个文件,看到下图红色框处所示。我已经将原本的4g改小了。这是分配给Java运行时环境的内存。如果你的机器没那么大内存,那么就会报错。
另外一个文件是runbroker.sh文件,同样用vi编辑文件,下图是我改过的分配内存大小。具体你是要改大还是由你需求决定。
下图给出的是因内存不足报错的截图,看到这个错误我想应该知道怎么解决了。
二、启动服务
1、在启动服务前先修改一个配置文件。进入到rocketmq-all-4.3.0/distribution/target/apache-rocketmq/conf路径下。打开broker.conf文件,在最后一行加上如下图红框处所示配置。将下图中的106.12.108.183改为你服务器的ip。
2、进入到rocketmq-all-4.3.0/distribution/target/apache-rocketmq/bin路径下,输入nohup ./mqnamesrv -n ip:9876 &,将ip改为你服务器的ip地址。这样nameserver服务就启动了。输入jps会看到有个NamesrvStartup服务。
3、接下来启动broker,还是在这个路径下输入nohup sh mqbroker -n ip:9876 -c ../conf/broker.conf autoCreateTopicEnable=true > borker.out &来启动broker。将ip改为你服务器的ip地址。我来解释一下这句话,使用nohup来让程序在后台运行。使用sh命令启动mqbroker这个文件。-n指定broker受哪个nameserver管理。ip:9876就是nameserver的地址啦。-c指定启动broker的配置文件。autoCreateTopicEnable=true指当topic不存在时,会默认创建,线上一般是false,就是说你第一次部署rocketmq,然后往里丢消息,此时你指定的topic是不存在的,那么就会创建这个topic。如果autoCreateTopicEnable为false,那么就会出现No route info of this topic错误,默认为false。
4、此时应该都启动成功了,输入jps会看到NamesrvStartup、BrokerStartup两个服务。
三、使用
1、打开你的ide,创建一个maven项目。然后在pom文件加入如下依赖。
<!-- rocketmq客户端所需依赖 -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.0</version>
</dependency>
2、创建一个名为Producer的java类,代码如下:
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
public class Producer {
public static void main(String[] args) throws Exception {
// 创建一个producer。名为group
DefaultMQProducer producer = new DefaultMQProducer("group");
// 指定nameserver的地址
producer.setNamesrvAddr("106.12.108.183:9876");
// 启动服务
producer.start();
for(int i=1;i<=10;i++) {
// 创建消息,orders为topic,相当于给消息分类,("order"+i).getBytes()为消息实体
Message message = new Message("orders",("order"+i).getBytes());
// 发送消息
SendResult result = producer.send(message);
System.out.println(result);
System.out.println(message + "send out");
Thread.sleep(500);
}
// 关闭服务
producer.shutdown();
}
}
3、在创建一个名为Consumer的java类,代码如下:
import java.util.List;
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.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
public class Consumer {
public static void main(String[] args) {
// 创建consumer,名为consumer
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer");
// 指定nameserver的地址
consumer.setNamesrvAddr("106.12.108.183:9876");
try {
// 设置要订阅的消息,orders为topic,*为该topic下的所有消息
consumer.subscribe("orders", "*");
// 设置消费位
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
// 通过getBody()输出消息实体内容
System.out.printf(Thread.currentThread().getName() + "收到新消息:" + new String(msgs.get(0).getBody()) + "%n");
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
// 开启服务
consumer.start();
} catch (MQClientException e) {
e.printStackTrace();
}
// 关闭服务
consumer.shutdown();
}
}
4、先启动Consumer,再启动Producer,因为DefaultMQPushConsumer是来一条消息接收一条,所以先启动Consumer。最后你看到的控制台的内容应该如下图所示:
Producer:
Consumer:
四、总结
关于rocketmq的介绍就到这了哦,后续如果有更多发现会持续更新,博文中有不全或不足的地方非常欢迎大家指正,有不懂的地方请留言,我会每天查看,如看到会尽快回复,谢谢大家!