当前位置: 首页 > news >正文

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

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 {

    @Autowired
    private MessageRepository messageRepository;

    @Autowired
    private 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> {

    @Autowired
    private MessageService messageService;

    @Override
    public 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 {

    @Autowired
    private MessageService messageService;

    @GetMapping("/{receiverId}")
    public List<Message> getMessages(@PathVariable String receiverId) {
        return messageService.getMessagesByReceiver(receiverId);
    }

    @PostMapping
    public 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请求。

相关文章:

  • python-leetcode 40.二叉树的层序遍历
  • 【Windows API】SetFilePointerEx函数用法介绍
  • 数仓搭建(hive):DM搭建(数据集市层)
  • MVCC(多版本并发控制)
  • LLM论文笔记 15: Transformers Can Achieve Length Generalization But Not Robustly
  • linux学习【7】Sourc Insight 4.0设置+操作
  • 有限元分析的两种数值求解方法:显式分析和隐式分析
  • 一文2000字从0到1用Jmeter全流程性能测试实战
  • 【Spring属性注入】构造器注入 vs 字段注入
  • 企业知识管理的网络构建与优化路径探析
  • 【前端框架】Vue3 面试题深度解析
  • 利用ollama本地部署deepseek
  • Linux操作系统4-进程间通信3(基于管道的进程池设计)
  • Cython学习笔记1:利用Cython加速Python运行速度
  • 2025年信息科学与工程学院科协单片机编程介绍——按键拓展编程
  • 第6章:基于LangChain如何开发Agents,附带客户支持智能体示例
  • Spring Boot 中多线程工具类的配置与使用:基于 YAML 配置文件
  • 21.回溯算法3
  • 【2025最新版】Chrome谷歌浏览器如何能恢复到之前的旧版本
  • 【信息系统项目管理师-案例真题】2013下半年案例分析答案和详解
  • 牧原股份一季度归母净利润44.91亿元,同比扭亏为盈
  • 人民日报:外资车企携新车、前沿技术亮相上海车展,坚定信心深耕中国市场
  • 出35万元为副县长的女友凑购房首付,青海一商人被判缓刑
  • 上海常务副市长:持续提升跨境投融资便利化水平,稳步扩大金融领域的制度型开放
  • 创单次出舱活动时长世界纪录,一组数据盘点神十九乘组工作成果
  • 人民网评“我愿意跟他挨着”热搜第一:充满温暖力量的七个字