springboot操作rocketMq
rocketMq介绍
消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性。主要具有以下优势:
削峰填谷(主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题)
系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死)
提升性能(当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统)
蓄流压测(线上有些链路不好压测,可以通过堆积一定量消息再放开来压测)
目前主流的MQ主要是Rocketmq、kafka、Rabbitmq,Rocketmq相比于Rabbitmq、kafka具有主要优势特性有:
• 支持事务型消息(消息发送和DB操作保持两方的最终一致性,rabbitmq和kafka不支持)
• 支持结合rocketmq的多个系统之间数据最终一致性(多方事务,二方事务是前提)
• 支持18个级别的延迟消息(rabbitmq和kafka不支持)
• 支持指定次数和时间间隔的失败消息重发(kafka不支持,rabbitmq需要手动确认)
• 支持consumer端tag过滤,减少不必要的网络传输(rabbitmq和kafka不支持)
• 支持重复消费(rabbitmq不支持,kafka支持)
Rocketmq、kafka、Rabbitmq的详细对比,请参照下表格:
rocketMq下载安装
由于一般公司都是由于运维会安装rocketMq,这里为了学习方便安装的windows的
1.下载
rocketMq官网: http://rocketmq.apache.org/
进入官网安装步骤下载后即可,得到的zip包,在选择合适位置解压即可
2.安装
- 配置环境变量
在下载好后,寻找合适位置解压后,需要在自己系统的环境变量中配置
ROCKETMQ_HOME 配置自己解压位置的,比如我的 F:\rocketmq-all-4.7.0-bin-release - 启动rocketmq
在cmd窗口分别执行bin目录下的mqnamesrv.cmd和mqbroker.cmd,执行完之后会弹出新的窗口,都不要关闭,如图:
mqnamesrv启动命令:start mqnamesrv.cmd
mqbroker启动命令:start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true
注意:如果输入命令后提示 Please set the ROCKETMQ_HOME variable in your environment!
那么建议
修改 runbroker.cmd
将
set "JAVA_OPT=%JAVA_OPT% -cp %CLASSPATH%"
改为
set "JAVA_OPT=%JAVA_OPT% -cp "%CLASSPATH%""
rocketMq运行
springboot整合
创建一个springboot的项目,这里就不过多创建了
1. 导入依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.4</version>
</dependency>
2. 配置配置文件
rocketmq:
# 接收消息
name-server: 127.0.0.1:9876
producer:
group: my-group
# 其他的配置 发送超时时长
send-message-timeout: 3000
# 消息 Body 超过多大开始压缩
compress-message-body-threshold: 4096
# 限制的消息大小
max-message-size: 4194304
# 开启内部消息重试
retry-next-server: true
# 失败重试次数
retry-times-when-send-async-failed: 2
3. 创建生成者
@RunWith(SpringRunner.class)
@SpringBootTest
public class RocketMqTest {
@Resource
private RocketMQTemplate rocketMQTemplate;
@Test
public void testRocketMq1() {
String name = "aaa";
rocketMQTemplate.convertAndSend("test-topic-1", name);
rocketMQTemplate.send("test-topic-2", MessageBuilder.withPayload(new User(1L,"ace",24)).build());
System.err.println("发送成功...");
}
}
4. 创建消费者
@Service
//消息接收者的 主题和分组名称方便接收对应的消息
@RocketMQMessageListener(topic = "test-topic-2", consumerGroup = "my-consumer_test-topic-2")
public class OrderPaidEventConsumer implements RocketMQListener<User> {
@Override
public void onMessage(User message) {
System.out.print("------- OrderPaidEventConsumer received:"+ JSON.toJSONString(message));
}
}
注:使用的实体类
@Data
public class User {
private Long id;
private String name;
private Integer age;
public User(){}
public User(Long id, String name, int age) {
this.id = id;
this.age = age;
this.name = name;
}
}