现在使用rocketmq基本上都是搭载spring配合使用的,现在就以springBoot作为演示。
1.首先先倒入所需依赖包
<dependency>
<groupId>com.alibaba.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
备注:这里切记要倒入正确的fastjson包,否则会导致收发消息报错:路由异常说该nameserver下没有配置此topic
2.分别启动nameserver和broker
> nohup sh bin/mqnamesrv &
> nohup sh bin/mqbroker -n localhost:9876&
备注:切记一定要先查看自身的ip,启动broker记得查看broker日志是否成功
broker日志地址:~/logs/rocketmqlogs/broker.log
2019-12-02 13:53:12 INFO brokerOutApi_thread_2 - register broker[0]to name server 192.168.142.80:9876 OK
查看java程序进程,看是否有启动namesev 和 broker
>jps
6599 RemoteMavenServer36
6743 BrokerStartup
6747 Jps
6653 Launcher
6670 NamesrvStartup
3.停止Nameserver 和 Broker服务
首先进入bin目录会存在这么一个服务mqshutdown,当然也存在刚刚启动的broker和nameserver服务
所以停止nameServer 和 Broker 命令如下:
(base) bogon:rocketmq-all-4.6.0-bin-release humingming$ sh bin/mqshutdown namesrv --停止注册发现状态服务
The mqnamesrv(12524) is running...
Send shutdown request to mqnamesrv(12524) OK
(base) bogon:rocketmq-all-4.6.0-bin-release humingming$ sh bin/mqshutdown broker --停止broker服务
The mqbroker(12534) is running...
Send shutdown request to mqbroker(12534) OK
[3]+ Exit 143 nohup sh bin/mqnamesrv
4.编写 生产者和消费者例子
package rocketmq.day01;
import com.alibaba.rocketmq.client.exception.MQBrokerException;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
import com.alibaba.rocketmq.client.producer.SendResult;
import com.alibaba.rocketmq.common.message.Message;
import com.alibaba.rocketmq.remoting.exception.RemotingException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author heian
* @create 2019-11-28-8:23 下午
* @description
*/
public class ProducerDemo {
public static void main(String[] args) throws MQClientException {
DefaultMQProducer producer = new DefaultMQProducer("unique_producer_group__name");
producer.setNamesrvAddr("192.168.142.80:9876");
producer.start();
for (int i = 0; i < 1; i++) {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat();
String format = sdf.format(date);
Message message = new Message("topicName", String.valueOf(i),format.getBytes());
SendResult sendResult= new SendResult();
try {
sendResult = producer.send(message);
} catch (RemotingException |MQBrokerException | InterruptedException e) {
System.out.println("消息发送失败:" + sendResult.getMsgId());
e.printStackTrace();
}
System.out.println("key:"+i + "消息的发送结果为:" + sendResult.toString() + "消息ID为:" + sendResult.getMsgId());
}
}
}
package rocketmq.day01;
import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
import com.alibaba.rocketmq.common.message.MessageExt;
import java.io.UnsupportedEncodingException;
import java.util.List;
/**
* @author heian
* @create 2019-11-28-8:51 下午
* @description
*/
public class ConsumeDemo {
public static void main(String[] args) throws MQClientException {
DefaultMQPushConsumer defaultMQPushConsumer = new DefaultMQPushConsumer("unique_consume_group_name");
defaultMQPushConsumer.setNamesrvAddr("192.168.142.80:9876");
// 设置消费地点,从最第一个进行消费(其实就是消费策略)
defaultMQPushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
defaultMQPushConsumer.subscribe("topicName","*");
defaultMQPushConsumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
byte[] body = list.get(0).getBody();
try {
String ms = new String(body,"utf-8");
System.out.println(Thread.currentThread().getName() + "监听到消息:" + ms);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
defaultMQPushConsumer.start();
}
}
5. 分别启动生产者和消费者
控制台打印信息如下:
--生产者控制台
key:0消息的发送结果为:SendResult [sendStatus=SEND_OK, msgId=C0A88E5000002A9F0000000000070774, messageQueue=MessageQueue [topic=topicName, brokerName=bogon, queueId=0], queueOffset=20]消息ID为:C0A88E5000002A9F0000000000070774
--消费者控制台
ConsumeMessageThread_1监听到消息:19-12-2 下午2:00
备注:可以发现一则消息发送前后必须先定义
- GroupName(生产组名和消费组名)
- NameServer地址及端口(broker必须先注册到Nmaesrv上,有点类似于nio中的serverSocketChannel.register(selector, 0)),就是服务端开启一个通道,客户端往通道内写数据,服务端用selector去一对多监听多个客户端
- topic名称或者更细的tags
此外:1.rocketmq读写队列默认是8个,生产上配置则是按照实例数的两倍,比如生产上有8个微服务,则一般配置16个读写队列
2.消费端线程监听默认是最大起20个线程监听
图形化界面管理mq集群
对于rocketmq新手如果我们要查看消息的一些轨迹或者topic的一些信息啊,使用mqadmin命令有点不切实际(mqadmin命令),所以需要又一个类似于navicat一样的可视化界面。
运维服务是一个springboot项目,需要从GitHub上下载地址为:https://github.com/apache/rocketmq-externals 进入后我们需要下载这些组件到本地,我们用到的只有rocketmq-console这个项目文件夹。
- 自身你可以用idea打开看其源码,在这个boot项目中又一个properties文件,将namesrv地址配置成自身的IP地址:rocketmq.config.namesrvAddr=localhost:9876 如果是集群部署则 ip:9876;ip2;9876
- 将boot项目打成jar包 直接使用命令:进入到/Users/humingming/IdeaProjects/rocketmq-console 文件夹执行此命令
编译命令:mvn clean package -Dmaven.test.skip=true(注意:不要直接使用mvn package,会提示很多错误)
会在boot项目中生成target文件夹并在其中生成jar文件,我们主要用到的就是此:rocketmq-console-ng-1.0.1.jar
-
切换到该jar包目录直接运行:java -jar rocketmq-console-ng-1.0.1.jar 可以直接在idea中输入这些命令,直接打包和运行jar包
java -jar rocketmq-console-ng-1.0.1.jar
备注:如果ip地址不对,或者端口冲突,可以在运行jar后面加个后缀
-
直接访问运行好的jar (其实就是运行了一个sprongboot项目) http://localhost:8080/
至此,开启我们的rocketmq 学习之旅!!!