Spring Boot 集成 RocketMQ(1)

    • 集成
  • 生产者

    • 同步发送消息
  • 异步发送消息

  • 单向发送消息

  • 发送有序消息

  • 发送事务消息

  • 发送特殊标签(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-keyrocketmq.consumer.secret-key 配置项,这两个配置项的值就是默认值

消息轨迹

Producer 端要想使用消息轨迹,需要多配置两个配置项:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

复习的面试资料

这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)

  • 第一部分:Java基础-中级-高级

image

  • 第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)

image

  • 第三部分:性能调优(JVM+MySQL+Tomcat)

image

  • 第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)

image

  • 第五部分:微服务(SpringBoot+SpringCloud+Dubbo)

image

  • 第六部分:其他:并发编程+设计模式+数据结构与算法+网络

image

进阶学习笔记pdf

  • Java架构进阶之架构筑基篇(Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法

image

  • Java架构进阶之开源框架篇(设计模式+Spring+SpringMVC+MyBatis

image

image

image

  • Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)

image

image

image

  • Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)

image

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
构与算法+网络**

[外链图片转存中…(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)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot可以很方便地集成RocketMQ,可以通过以下步骤实现: 1. 在pom.xml中添加RocketMQ的依赖: ```xml <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>${rocketmq.version}</version> </dependency> ``` 2. 在application.properties中配置RocketMQ相关信息: ```properties spring.rocketmq.name-server=127.0.0.1:9876 spring.rocketmq.producer.group=producer_group spring.rocketmq.consumer.group=consumer_group ``` 3. 创建消息生产者: ```java import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Component; @Component public class Producer { @Autowired private RocketMQTemplate rocketMQTemplate; public void send(String message) { Message<String> msg = MessageBuilder.withPayload(message).build(); rocketMQTemplate.send("topic", msg); } } ``` 4. 创建消息消费者: ```java import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; import org.springframework.stereotype.Component; @Component @RocketMQMessageListener(topic = "topic", consumerGroup = "consumer_group") public class Consumer implements RocketMQListener<String> { @Override public void onMessage(String message) { System.out.println("Received message: " + message); } } ``` 5. 在需要发送消息的地方调用Producer的send方法即可: ```java @Autowired private Producer producer; public void sendMsg() { producer.send("Hello RocketMQ!"); } ``` 6. 启动应用程序,即可发送和接收RocketMQ消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值