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);
}
}