将RocketMQ集成到了Spring Boot项目中,实现站内信功能

news/2025/2/22 6:27:35/

1. 添加依赖

首先,在pom.xml中添加RocketMQ的依赖:

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Starter Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- H2 Database (或你选择的其他数据库) --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><!-- Redis Cache --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- RocketMQ --><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.1</version></dependency>
</dependencies>

2. 配置文件

application.properties中配置RocketMQ的相关信息:

# Redis Configuration
spring.redis.host=localhost
spring.redis.port=6379# RocketMQ Configuration
rocketmq.name-server=localhost:9876
rocketmq.producer.group=my-producer-group

3. 数据模型

定义Message实体类:

package com.example.inbox.model;import javax.persistence.*;
import java.time.LocalDateTime;@Entity
public class Message {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String senderId;private String receiverId;private String subject;private String body;private LocalDateTime timestamp;private boolean read;// Getters and Setters
}

4. Repository接口

创建MessageRepository接口:

package com.example.inbox.repository;import com.example.inbox.model.Message;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Repository
public interface MessageRepository extends JpaRepository<Message, Long> {
}

5. Service层

在Service层中集成缓存和RocketMQ的消息发送与接收:

package com.example.inbox.service;import com.example.inbox.model.Message;
import com.example.inbox.repository.MessageRepository;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class MessageService {@Autowiredprivate MessageRepository messageRepository;@Autowiredprivate RocketMQTemplate rocketMQTemplate;@Cacheable(value = "messages", key = "#receiverId")public List<Message> getMessagesByReceiver(String receiverId) {return messageRepository.findByReceiverId(receiverId);}@CacheEvict(value = "messages", key = "#message.receiverId")public void sendMessage(Message message) {rocketMQTemplate.convertAndSend("messageTopic", message);}
}

6. 消息监听器

创建一个监听器来处理来自RocketMQ的消息:

package com.example.inbox.listener;import com.alibaba.fastjson.JSON;
import com.example.inbox.model.Message;
import com.example.inbox.service.MessageService;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
@RocketMQMessageListener(topic = "messageTopic", consumerGroup = "my-consumer-group")
public class MessageListener implements RocketMQListener<String> {@Autowiredprivate MessageService messageService;@Overridepublic void onMessage(String messageJson) {Message message = JSON.parseObject(messageJson, Message.class);message.setTimestamp(java.time.LocalDateTime.now());messageService.saveMessage(message);}
}

7. Controller

创建Controller来处理HTTP请求:

package com.example.inbox.controller;import com.example.inbox.model.Message;
import com.example.inbox.service.MessageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/messages")
public class MessageController {@Autowiredprivate MessageService messageService;@GetMapping("/{receiverId}")public List<Message> getMessages(@PathVariable String receiverId) {return messageService.getMessagesByReceiver(receiverId);}@PostMappingpublic void sendMessage(@RequestBody Message message) {messageService.sendMessage(message);}
}

8. 启动类

确保你的Spring Boot应用启动类包含必要的注解:

package com.example.inbox;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching
public class InboxApplication {public static void main(String[] args) {SpringApplication.run(InboxApplication.class, args);}
}

总结

通过以上步骤,我们成功地将RocketMQ集成到了Spring Boot项目中,实现了站内信系统的异步处理。主要步骤包括:

  1. 添加RocketMQ依赖:在pom.xml中添加RocketMQ相关的依赖。
  2. 配置RocketMQ:在application.properties中配置RocketMQ的相关参数。
  3. 数据模型和Repository:定义实体类和Repository接口。
  4. Service层:在Service层中集成RocketMQ的消息发送和Redis缓存。
  5. 消息监听器:使用@RocketMQMessageListener注解创建消息监听器,处理接收到的消息。
  6. Controller:创建RESTful API来处理HTTP请求。

http://www.ppmy.cn/news/1574079.html

相关文章

Powershell Install deepseek

前言 deepseekAI助手。它具有聊天机器人功能&#xff0c;可以与用户进行自然语言交互&#xff0c;回答问题、提供建议和帮助解决问题。DeepSeek 的特点包括&#xff1a; 强大的语言理解能力&#xff1a;能够理解和生成自然语言&#xff0c;与用户进行流畅的对话。多领域知识&…

OpenSSL crt key (生成一套用于TLS双向认证的证书密钥)

OpenSSL—— TLS证书 问&#xff1a;如何生成一套TLS证书、密钥呢&#xff1f; 生成一套 TLS 证书&#xff0c;包括 根 CA 证书、服务器证书、客户端证书&#xff0c;可以使用 openssl 命令来完成。完整的步骤如下&#xff0c;包括根 CA、服务器证书和客户端证书的生成。 &am…

网络安全钓鱼邮件测试 网络安全 钓鱼

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 如今&#xff0c;网络安全是一个备受关注的话题&#xff0c;“网络钓鱼”这个词也被广泛使用。 即使您对病毒、恶意软件或如何在线保护自己一无所知&#xff0c;您…

初等数论--乘法逆元

1. 简介 乘法逆元&#xff0c;相同于在模除法做像倒数一样的操作。 比如&#xff1a; 对于模 5 : 4 5: \quad4 5:4的逆元是什么 1 4 ≡ v ( m o d 5 ) \frac{1}{4} \equiv v ( \bmod\ 5) 41​≡v(mod 5) 也就是在模中除 4 4 4&#xff0c;相当于乘上一个什么样的数。 4 v ≡…

基于ffmpeg+openGL ES实现的视频编辑工具-字幕添加(六)

在视频编辑领域,字幕的添加是一项极为重要的功能,它能够极大地丰富视频内容,提升观众的观看体验。当我们深入探究如何实现这一功能时,FreeType 开源库成为了强大助力。本文将详细阐述借助 FreeType 库生成字幕数据的过程,以及如何实现字幕的缩放、移动、旋转、颜色修改、对…

设计心得——接口

一、接口 在编程者的口中&#xff0c;经常可以听到接口这个说法或者说概念&#xff0c;那什么是接口呢&#xff1f;如果在一些编程语言中&#xff0c;有接口这种定义的话&#xff0c;就非常好理解&#xff0c;比如Java,go等。但在C和C中根本没有接口这个定义的话&#xff0c;什…

20250221 NLP

1.向量和嵌入 https://zhuanlan.zhihu.com/p/634237861 encoder的输入就是向量&#xff0c;提前嵌入为向量 二.多模态文本嵌入向量过程 1.文本预处理 文本tokenizer之前需要预处理吗&#xff1f; 是的&#xff0c;文本tokenizer之前通常需要对文本进行预处理。预处理步骤可…

工业机器人中用于3D碰撞检测的算法库有哪些

在工业机器人领域&#xff0c;3D碰撞检测是确保安全运行和路径规划的关键技术。以下是常用的算法库及其特点&#xff0c;分类整理供参考&#xff1a; 一、开源算法库 FCL (Flexible Collision Library) 特点&#xff1a;专为机器人设计&#xff0c;支持刚体、复杂几何模型&…