-
- 集成
-
生产者
-
- 同步发送消息
-
异步发送消息
-
单向发送消息
-
发送有序消息
-
发送事务消息
-
发送特殊标签(tag)消息
-
发送批量消息
-
消费者
-
- Push模式
-
Pull模式
-
高级
-
- 请求应答语义
-
ACL功能
-
消息轨迹
-
常见问题
官网地址: https://github.com/apache/rocketmq-spring
特性
-
同步发送消息
-
异步发送消息
-
以单向模式发送消息
-
发送有序消息
-
发送批量消息
-
发送交易消息
-
发送具有延迟级别的预定消息
-
以并发模式(广播/集群)消费消息
-
消费有序消息
-
使用标记或 sql92 表达式过滤消息
-
支持消息追踪
-
支持认证和授权
-
支持请求-回复消息交换模式
-
使用推/拉模式消费消息
直接使用官方的rocketmq-spring-boot-starter
地址:https://search.maven.org/artifact/org.apache.rocketmq/rocketmq-spring-boot-starter
pom.xml
org.apache.rocketmq
rocketmq-spring-boot-starter
2.1.1
2.1.1版本,内置的rocketmq-client版本为4.7.1应该与你rocketmq服务保持一致。
配置文件如下:
rocketmq:
rocketMQ的命名服务器,格式为: host:port;host:port
name-server: localhost:9876
producer:
生产者的组名
group: my-group1
发送消息超时时间 默认3秒
send-message-timeout: 3000
注意:
请将上述示例配置中的
127.0.0.1:9876
替换成真实RocketMQ的NameServer地址与端口
引入RocketMQTemplate
@Resource
private RocketMQTemplate rocketMQTemplate;
同步发送消息
可靠的同步传输应用于广泛的场景,如重要通知消息、短信通知、短信营销系统等。
// 发送字符串
rocketMQTemplate.syncSend(“springTopic”, “Hello, World!”);
// 同步发送
rocketMQTemplate.convertAndSend(“test-topic-1”, “Hello, World!”);
// 发送对象
rocketMQTemplate.syncSend(“userTopic”, new User().setUserAge((byte) 18).setUserName(“Kitty”));
// 发送spring 消息
rocketMQTemplate.syncSend(userTopic, MessageBuilder.withPayload(
new User().setUserAge((byte) 21).setUserName(“Lester”)).setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON_VALUE).build());
异步发送消息
异步传输一般用于响应时间敏感的业务场景。
rocketMQTemplate.asyncSend(“orderPaidTopic”, “异步发送”, new SendCallback() {
@Override
public void onSuccess(SendResult var1) {
// 成功回调
System.out.printf(“async onSucess SendResult=%s %n”, var1);
}
@Override
public void onException(Throwable var1) {
// 失败回调
System.out.printf(“async onException Throwable=%s %n”, var1);
}
});
单向发送消息
单向传输用于需要中等可靠性的情况,例如日志收集。
rocketMQTemplate.sendOneway(“springTopic”, “Hello, World!”);
发送有序消息
rocketMQTemplate.syncSendOrderly(“orderly_topic”,MessageBuilder.withPayload(“Hello, World”).build(),“hashkey”)
发送事务消息
Message msg = MessageBuilder.withPayload("rocketMQTemplate transactional message ").build();
// 第一个参数必须与@RocketMQTransactionListener的成员字段’transName’相同
rocketMQTemplate.sendMessageInTransaction(“test-topic”, msg, null);
// 使用注解@RocketMQTransactionListener定义事务监听器
@RocketMQTransactionListener
class TransactionListenerImpl implements RocketMQLocalTransactionListener {
@Override
public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
// … local transaction process, return bollback, commit or unknown
return RocketMQLocalTransactionState.UNKNOWN;
}
@Override
public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
// … check transaction status and return bollback, commit or unknown
return RocketMQLocalTransactionState.COMMIT;
}
}
发送特殊标签(tag)消息
rocketMQTemplate.convertAndSend(msgExtTopic + “:tag0”, “I’m from tag0”); // tag0 不是消费者选择的,可以通过tag过滤掉
rocketMQTemplate.convertAndSend(msgExtTopic + “:tag1”, “I’m from tag1”);
发送批量消息
List msgs = new ArrayList();
for (int i = 0; i < 10; i++) {
msgs.add(MessageBuilder.withPayload(“Hello RocketMQ Batch Msg#” + i).
setHeader(RocketMQHeaders.KEYS, “KEY_” + i).build());
}
SendResult sr = rocketMQTemplate.syncSend(springTopic, msgs, 60000);
配置文件如下:
rocketmq:
rocketMQ的命名服务器,格式为: host:port;host:port
name-server: localhost:9876
注意:
请将上述示例配置中的
127.0.0.1:9876
替换成真实RocketMQ的NameServer地址与端口
Push模式
编写代码
@Slf4j
@Service
@RocketMQMessageListener(topic = “laker-123”, consumerGroup = “laker_consumer_group”)
public class MyConsumer1 implements RocketMQListener {
public void onMessage(String message) {
log.info(“received message: {}”, message);
}
}
@Slf4j
@Service
@RocketMQMessageListener(topic = “test-topic-2”, consumerGroup = “my-consumer_test-topic-2”)
public class MyConsumer2 implements RocketMQListener {
public void onMessage(OrderPaidEvent orderPaidEvent) {
log.info(“received orderPaidEvent: {}”, orderPaidEvent);
}
}
这里只要不抛出异常,就会认为是成功返回
CONSUME_SUCCESS
,否则返回RECONSUME_LATER
,boker会重试,相应代码如下
public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) {
for (MessageExt messageExt : msgs) {
log.debug("received msg: {}", messageExt);
try {
long now = System.currentTimeMillis();
handleMessage(messageExt);等价于rocketMQListener.onMessage(doConvertMessage(messageExt));
long costTime = System.currentTimeMillis() - now;
log.debug("consume {} cost: {} ms", messageExt.getMsgId(), costTime);
} catch (Exception e) {
log.warn("consume message failed. messageExt:{}, error:{}", messageExt, e);
context.setDelayLevelWhenNextConsume(delayLevelWhenNextConsume);
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
Pull模式
从RocketMQ Spring 2.2.0开始,RocketMQ Srping支持Pull模式消费
修改application.properties
application.properties
rocketmq.name-server=127.0.0.1:9876
rocketmq.consumer.group=my-group1
rocketmq.consumer.topic=test
编写代码
@SpringBootApplication
public class ConsumerApplication implements CommandLineRunner {
@Resource
private RocketMQTemplate rocketMQTemplate;
@Override
public void run(String… args) throws Exception {
//This is an example of pull consumer using rocketMQTemplate.
List messages = rocketMQTemplate.receive(String.class);
System.out.printf(“receive from rocketMQTemplate, messages=%s %n”, messages);
}
}
请求应答语义
RocketMQ-Spring 提供 请求/应答 语义支持。
- Producer端
发送Request消息使用SendAndReceive方法
注意
同步发送需要在方法的参数中指明返回值类型
异步发送需要在回调的接口中指明返回值类型
// 同步发送request并且等待String类型的返回值
String replyString = rocketMQTemplate.sendAndReceive(“stringRequestTopic”, “request string”, String.class);
// 异步发送request并且等待User类型的返回值
rocketMQTemplate.sendAndReceive(“objectRequestTopic”, new User(“requestUserName”,(byte) 9), new RocketMQLocalRequestCallback() {
@Override public void onSuccess(User message) {
System.out.printf(“send user object and receive %s %n”, message.toString());
}
@Override public void onException(Throwable e) {
e.printStackTrace();
}
}, 5000);
- Consumer端
需要实现RocketMQReplyListener<T, R> 接口,其中T表示接收值的类型,R表示返回值的类型。
@SpringBootApplication
public class ConsumerApplication{
public static void main(String[] args){
SpringApplication.run(ConsumerApplication.class, args);
}
@Service
@RocketMQMessageListener(topic = “stringRequestTopic”, consumerGroup = “stringRequestConsumer”)
public class StringConsumerWithReplyString implements RocketMQReplyListener<String, String> {
@Override
public String onMessage(String message) {
System.out.printf(“------- StringConsumerWithReplyString received: %s \n”, message);
return “reply string”;
}
}
@Service
@RocketMQMessageListener(topic = “objectRequestTopic”, consumerGroup = “objectRequestConsumer”)
public class ObjectConsumerWithReplyUser implements RocketMQReplyListener<User, User>{
public void onMessage(User user) {
System.out.printf(“------- ObjectConsumerWithReplyUser received: %s \n”, user);
User replyUser = new User(“replyUserName”,(byte) 10);
return replyUser;
}
}
@Data
@AllArgsConstructor
public class User implements Serializable{
private String userName;
private Byte userAge;
}
}
ACL功能
Producer 端要想使用 ACL 功能,需要多配置两个配置项:
application.properties
rocketmq.name-server=127.0.0.1:9876
rocketmq.producer.group=my-group
rocketmq.producer.access-key=AK
rocketmq.producer.secret-key=SK
Consumer 端 ACL 功能需要在 @RocketMQMessageListener
中进行配置
@Service
@RocketMQMessageListener(
topic = “test-topic-1”,
consumerGroup = “my-consumer_test-topic-1”,
accessKey = “AK”,
secretKey = “SK”
)
public class MyConsumer implements RocketMQListener {
…
}
注意:
可以不用为每个
@RocketMQMessageListener
注解配置 AK/SK,在配置文件中配置rocketmq.consumer.access-key
和rocketmq.consumer.secret-key
配置项,这两个配置项的值就是默认值
消息轨迹
Producer 端要想使用消息轨迹,需要多配置两个配置项:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
复习的面试资料
这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)
- 第一部分:Java基础-中级-高级
- 第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)
- 第三部分:性能调优(JVM+MySQL+Tomcat)
- 第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)
- 第五部分:微服务(SpringBoot+SpringCloud+Dubbo)
- 第六部分:其他:并发编程+设计模式+数据结构与算法+网络
进阶学习笔记pdf
- Java架构进阶之架构筑基篇(Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法)
- Java架构进阶之开源框架篇(设计模式+Spring+SpringMVC+MyBatis)
- Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka))
- Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
构与算法+网络**
[外链图片转存中…(img-Sf0Qpx1E-1713388668527)]
进阶学习笔记pdf
- Java架构进阶之架构筑基篇(Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法)
[外链图片转存中…(img-nbxHxuSn-1713388668527)]
- Java架构进阶之开源框架篇(设计模式+Spring+SpringMVC+MyBatis)
[外链图片转存中…(img-0VnDvLry-1713388668528)]
[外链图片转存中…(img-NmOvgMOJ-1713388668528)]
[外链图片转存中…(img-lXtkoayl-1713388668528)]
- Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka))
[外链图片转存中…(img-Nqe1ipZ1-1713388668528)]
[外链图片转存中…(img-KSMdNLO5-1713388668529)]
[外链图片转存中…(img-ywI8OTv6-1713388668529)]
- Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)
[外链图片转存中…(img-HexaMt06-1713388668529)]
[外链图片转存中…(img-TvtlDkKv-1713388668530)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!