一、rocket MQ安装(单机)
1.1、安装配置
安装环境必须是64位。上传文件,并解压,更改解压后的文件名为rocketmq
unzip rocketmq-all-4.5.0-bin-release.zip
mv rocketmq-all-4.5.0-bin-release rocketmq
conf配置文件说明
2m-25-async:2主2从异步
2m-2s-smc:2主2从同步
2m-nos1ave:2主没有从
我们这里先配置单节点,可以修改2m-2s- async的配置实现。
进入2m-2s- async目录修改第1个配文件 broker-a.properties
将下面的配置覆盖掉broker-a.properties的所有配置
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,名字可重复,为了管理,每个master起一个名字,他的slave同他,eg:Amaster叫broker-a,他的slave也叫broker-a
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=192.168.209.36:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口,
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store/broker-a
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/broker-a/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/broker-a/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/broker-a/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
创建文件夹
mkdir -p /usr/local/rocketmq/store/broker-a
/usr/local/rocketmq/store/broker-a/nsumequeue
/usr/local/rocketmq/store/broker-a/commitlog
/usr/local/rocketmq/store/broker-a/index
/usr/local/rocketmq/logs
/usr/local/rocketmq/store/broker-b-s
/usr/local/rocketmq/store/broker-b-s/nsumequeue
/usr/local/rocketmq/store/broker-b-s/commitlog
/usr/local/rocketmq/store/broker-b-s/index
打开日志文件
更换日志命令
sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml
默认配置的内存较大,因为部署的是虚拟机,改小些
vim /usr/local/rocketmq/bin/runbroker.sh
vim /usr/local/rocketmq/bin/runserver.sh
1.2、启动
先启动namesrv
nohup sh mqnamesrv &
再启动broker
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties &
-c 后面指定刚才的配置文件。
1.3、利用web界面查看
修改配置文件,配置RocketMQ的服务器地址和端口,端口默认是9876,如果是集群一定使用**【分号】**隔开
使用maven打包
命令:
mvn clean package -Dmaven.test.skip=true
将jar运行起来,访问8080端口。
二、快速入门
2.1、RocketMQ消息消费者
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--引入rocketmq-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>${rocketmq.version}</version>
</dependency>
</dependencies>
package com.tl.mq.quickstart;
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 java.io.UnsupportedEncodingException;
/**
* @author gl
* @create 2019-11-14 17:11
*/
public class Producer {
public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
//1、创建DefaultMQProducer
DefaultMQProducer producer = new DefaultMQProducer("demo_producer_group") ;
//2、设置 Namesrv地址
producer.setNamesrvAddr("192.168.209.136:9876");
//3、开启DefaultMQProducer 使用public Message(String topic, String tags, String keys, byte[] body) 构造函数
producer.start();
//4、创建消息Message
//设置主题
Message message = new Message("Topic_Demo",
//主题
"Tages",
//消息唯一值
"Keys_1",
//内容
"Hello".getBytes(RemotingHelper.DEFAULT_CHARSET)
);
//5、发送消息
SendResult result = producer.send(message);
System.out.println(result);
//6、关闭DefaultMQProducer
producer.shutdown();
}
}
2.2、RocketMQ消息消费者
package com.tl.mq.quickstart;
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.Message;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import java.io.UnsupportedEncodingException;
import java.util.List;
/***
* 消息消费
* @author GL
*/
public class Consumer {
public static void main(String[] args) throws MQClientException {
//1、创建DefaultMQPullConsumer
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("demo_producer_group");
//2、设置 Namesrv地址
consumer.setNamesrvAddr("192.168.240.133:9876");
//设置消息拉去最大数
consumer.setConsumeMessageBatchMaxSize(2);
//3、设置subscribe,这里是读取的主题信息
//参数一:消费主题
//参数二:过滤规则
consumer.subscribe("Topic_Demo","Tages");
//创建消息监听MessageListener
consumer.setMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
//迭代消息信息
for (Message msg : msgs){
try {
//获取主题
String topic = msg.getTopic();
//获取标签
String tags = msg.getTags();
//获取信息
byte[] body = msg.getBody();
String result = new String(body, RemotingHelper.DEFAULT_CHARSET);
System.out.println("Consume消费信息——————topic:"+topic+",tages:"+tags+",result:"+result);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
//消息消费失败,重试,它还会继续消费
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
}
//消费成功
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//开启Consumer
consumer.start();
}
}
控制台信息
Consume消费信息——————topic:Topic_Demo,tages:Tages,result:Hello
发现一个问题:消费启动之后不会自动停止
2.3、RocketMQ顺序消息
package com.tl.mq.order.quickstart;
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.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.exception.RemotingException;
import java.io.UnsupportedEncodingException;
import java.util.List;
/**
* 顺序消息生产者
* 只需要将消息发送到一个队列里面就OK
* @author gl
* @create 2019-11-14 17:11
*/
public class OrderProducer {
public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
//1、创建DefaultMQProducer
DefaultMQProducer producer = new DefaultMQProducer("demo_producer_order_group") ;
//2、设置 Namesrv地址
producer.setNamesrvAddr("192.168.240.133:9876");
//3、开启DefaultMQProducer 使用public Message(String topic, String tags, String keys, byte[] body) 构造函数
producer.start();
//4、创建消息Message
//设置主题
Message message = new Message("Topic_order_Demo",
//主题
"Tages",
//消息唯一值
"Keys_1",
//内容
"Hello".getBytes(RemotingHelper.DEFAULT_CHARSET)
);
//5、发送消息
//第一个参数:发送的消息信息
//第二个参数:选中指定的消息队列对象(会将所有消息队列传入进来)
//第三个参数:指定对应的队列下标
//假设连续放松5条消息
for (int i = 0 ;i< 5 ;i++){
SendResult result = producer.send(
message,
new MessageQueueSelector() {
/**
*
* @param mqs 所有的消息队列,例如每一个RocketMQ有四个队列,有2个集群,那么就有8个消息队列。
* @param message
* @param arg 队列的下标
* @return
*/
@Override
public MessageQueue select(List<MessageQueue> mqs, Message message, Object arg) {
//获取队列的下标
Integer index = (Integer) arg;
//获取对应下标的队列
return mqs.get(index);
}
},
1
);
System.out.println(result);
}
//6、关闭DefaultMQProducer
producer.shutdown();
}
}
控制条信息
2.4、RocketMQ顺序消费
package com.tl.mq.order.quickstart;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.*;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import java.io.UnsupportedEncodingException;
import java.util.List;
/***
* 消息消费
* @author GL
*/
public class OrderConsumer {
public static void main(String[] args) throws MQClientException {
//1、创建DefaultMQPullConsumer
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("demo_producer_order_group");
//2、设置 Namesrv地址
consumer.setNamesrvAddr("192.168.240.133:9876");
//设置消息拉去最大数
consumer.setConsumeMessageBatchMaxSize(2);
//3、设置subscribe,这里是读取的主题信息
//参数一:消费主题
//参数二:过滤规则,可以写成主题
consumer.subscribe("Topic_order_Demo",
"*");
//创建消息监听MessageListener
consumer.setMessageListener(new MessageListenerOrderly() {
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
for (MessageExt msg : msgs){
try {
//获取主题
String topic = msg.getTopic();
//获取标签
String tags = msg.getTags();
//获取信息
byte[] body = msg.getBody();
String result = new String(body, RemotingHelper.DEFAULT_CHARSET);
System.out.println("Order————Consume消费信息——————topic:"+topic+",tages:"+tags+",result:"+result);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
//消息消费失败,重试,它还会继续消费
return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;
}
}
//成功
return ConsumeOrderlyStatus.SUCCESS;
}
});
//开启Consumer
consumer.start();
}
}
控制台信息
Order————Consume消费信息——————topic:Topic_order_Demo,tages:Tages,result:Hello
Order————Consume消费信息——————topic:Topic_order_Demo,tages:Tages,result:Hello
Order————Consume消费信息——————topic:Topic_order_Demo,tages:Tages,result:Hello
Order————Consume消费信息——————topic:Topic_order_Demo,tages:Tages,result:Hello
Order————Consume消费信息——————topic:Topic_order_Demo,tages:Tages,result:Hello
2.5、RocketMQ事务消息