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

基于Spring Boot,结合Redis缓存和RabbitMQ消息队列的站内信系统设计

1. 添加依赖

pom.xml中添加必要的依赖:

<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>

    <!-- RabbitMQ -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
</dependencies>
2. 配置文件

application.properties中配置Redis和RabbitMQ:

# Redis Configuration
spring.redis.host=localhost
spring.redis.port=6379

# RabbitMQ Configuration
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
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层中集成缓存和消息队列:

package com.example.inbox.service;

import com.example.inbox.model.Message;
import com.example.inbox.repository.MessageRepository;
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 RabbitTemplate rabbitTemplate;

    @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) {
        rabbitTemplate.convertAndSend("messageQueue", message);
    }
}
6. 消息监听器

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

package com.example.inbox.listener;

import com.example.inbox.model.Message;
import com.example.inbox.service.MessageService;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessageListener {

    @Autowired
    private MessageService messageService;

    @RabbitListener(queues = "messageQueue")
    public void receiveMessage(Message message) {
        message.setTimestamp(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);
    }
}

相关文章:

  • Mybatis的#{}和${}
  • 自适应SQL计划管理(Adaptive SQL Plan Management)在Oracle 12c中的应用
  • AD(Altium Designer)三种方法导入图片
  • 动态内存分配算法对比:最先适应、最优适应、最坏适应与邻近适应
  • 论文笔记-WSDM2025-ColdLLM
  • Hadoop-HA(高可用)机制
  • 重写QListWidget/QListView的代理,以网格的形式展示Item
  • jvm中各个参数的理解
  • Ubuntu编译ZLMediaKit
  • react实例与总结(二)
  • ollama修改监听ip: 0.0.0.0
  • deepseek清华大学第二版 如何获取 DeepSeek如何赋能职场应用 PDF文档 电子档(附下载)
  • 计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)
  • 分布式 IO 模块:水力发电设备高效控制的关键
  • 正则表达式特殊字符
  • Nginx 常用命令和部署详解及案例示范
  • arthas教程(还没有全部写完,有空更新)
  • QT事件循环
  • 【Spring详解五】bean的加载
  • Debian软件包重构
  • 印媒称印巴在克什米尔控制线沿线发生小规模交火,巴方暂未回应
  • 魔都眼·上海车展⑤|被主播包围的新车
  • 山西10岁男孩遭生母和继父殴打遇害,案件庭审延期
  • 商务部:美方应彻底取消所有对华单边关税措施
  • 神二十明日发射,长二F火箭推进剂加注工作已完成
  • 对话|四代中国缘的麦肯锡前高管:在混乱中制定规则,而不是复制旧秩序