持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
概述
RocketMQ是分布式消息队列,使用java开发。特点是高性能、低延时和高可靠。通过配置可保证消息不丢失,类似kafka,是分布式消息队列,能持久化保存数据到磁盘中。
最新版的RocketMq与SpringBoot2.X进行整合可以利用rocketmq-spring-boot-starter来简化配置,
maven依赖
首先引入maven依赖,rocketmq的starter
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
配置文件
添加如下配置文件
rocketmq:
name-server: 127.0.0.1:9876
producer:
#生产者组
group: "producer-group"
# 消息最大长度 默认 1024 * 4 (4M)
max-message-size: 4096
# 发送消息超时时间,默认 3000
send-message-timeout: 3000
# 发送消息失败重试次数,默认2
retry-times-when-send-failed: 2
retry-times-when-send-async-failed: 2
参数解释
name-server:配置rocketmq的地址,如果是集群用逗号分割retry-times-when-send-failed:是发送失败重试次数的配置,发送失败进行重试的规则如下:- 如果同步模式发送失败,则轮转到下一个
Broker,如果异步模式发送失败,则只会在当前Broker进行重试。这个方法的总耗时时间不超过sendMsgTimeout设置的值,默认10s。 - 如果本身向
Broker发送消息产生超时异常,就不会再重试。
- 如果同步模式发送失败,则轮转到下一个
生产消费实现
发送消息
springboot引入rocketmq的依赖后,可以直接使用注解@Resource声明RocketMQTemplate,RocketMQTemplate就是rocketmq的代理客户端,直接使用就可以发送消息。它包含了同步(syncSend)、异步(asyncSend)发送的方法。
- 同步消息:生产者发出一条消息后,会在收到MQ返回的ACK之后才发下一条消息。同步消息是有发送结果的。
- 异步消息:生产者发出消息后无需等待MQ返回ACK,直接发送下一条消息。可以指定回调。
示例
一个简单发送消息的示例,代码片段如下:
@Resource
private RocketMQTemplate rocketTemplate;
public void send(MyMessageEntity message) {
log.debug("发送msg:{}", JSON.toJSONString(message));
final SendResult sendResult = rocketTemplate.syncSend("topic1", JSON.toJSONString(message));
}
消费消息
消费消息使用注解@RocketMQMessageListener
下面列出了常用的参数
consumerGroup:指定消费者组名称topic:topic名称selectorType:消息选择器类型,默认根据tag选择selectorExpression:标签内容
注解部分源码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RocketMQMessageListener {
String consumerGroup();
String topic();
SelectorType selectorType() default SelectorType.TAG;
String selectorExpression() default "*";
...
}
示例
简单消费示例代码:
MyMessageEntity为自定义的消息体。一定要加@Component注解。以便Spring扫描bean时可以将其扫描到。
@Component
@Slf4j
@RocketMQMessageListener(topic = MqListener.GROUP_NAM, consumerGroup = MqListener.GROUP_NAME, messageModel = MessageModel.BROADCASTING)
public class MqListener implements RocketMQListener<MyMessageEntity> {
static final String GROUP_NAME = "topic1";
@Override
public synchronized void onMessage(MyMessageEntity message) {
log.info("监听到消息:{}", message.toString());
// 消息处理具体实现
this.handle(message);
}
小结
springboot实现RocketMQ的方式很简单,只要引入依赖,写好对应的配置即可使用。生产者通过调用RocketMQTemplate的各种方法进行发送消息,消费者通过注解@RocketMQMessageListener来消费消息,就可实现生产消费的简单通信。