使用 RabbitMQ 处理用户头像上传任务,同时将用户头像存储在 Minio 中是一个常见的应用场景。该示例将展示如何在 Spring Boot 项目中使用 RabbitMQ 和 Minio 实现此功能。示例包括两个部分:一是将头像上传任务推送到 RabbitMQ 队列中;二是从队列中消费任务并将用户头像上传到 Minio。
首先,请确保你在 Spring Boot 项目中引入以下依赖:
XML
<dependencies>
<!-- Spring Boot Starter AMQP for RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- Minio client library -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.2</version>
</dependency>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
1. 配置RabbitMQ和Minio:
首先,在 application.properties
文件中配置 RabbitMQ 和 Minio 的连接信息:
propertiesCopy code
bash
# RabbitMQ 配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
# Minio 配置
minio.url=http://localhost:9000
minio.accessKey=YOUR_ACCESS_KEY
minio.secretKey=YOUR_SECRET_KEY
minio.bucketName=avatars
2. 头像上传任务数据模型:
定义一个数据模型来表示头像上传任务,包括用户 ID 和头像文件内容:
java
import java.io.Serializable;
public class AvatarUploadTask implements Serializable {
private String userId;
private byte[] avatarData;
// Getters and setters...
}
3. 推送头像上传任务到 RabbitMQ:
在用户信息导入过程中,将头像上传任务推送到 RabbitMQ 队列:
java
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AvatarUploadService {
@Autowired
private AmqpTemplate amqpTemplate;
// 将头像上传任务推送到 RabbitMQ 队列
public void uploadAvatar(String userId, byte[] avatarData) {
AvatarUploadTask task = new AvatarUploadTask();
task.setUserId(userId);
task.setAvatarData(avatarData);
// 推送到 RabbitMQ 队列
amqpTemplate.convertAndSend("avatarUploadQueue", task);
}
}
4. 从 RabbitMQ 队列消费任务并将头像上传到 Minio:
创建一个消费者来从 RabbitMQ 队列中接收任务,并将用户头像上传到 Minio:
java
import io.minio.MinioClient;
import io.minio.errors.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AvatarUploadConsumer {
@Autowired
private MinioClient minioClient;
@Autowired
private AvatarUploadService avatarUploadService;
// 从 RabbitMQ 队列消费任务
@RabbitListener(queues = "avatarUploadQueue")
public void consumeAvatarUploadTask(AvatarUploadTask task) {
try {
// 将用户头像上传到 Minio
minioClient.putObject(
"avatars", // 存储桶名称
task.getUserId(), // 对象名称(用户 ID)
task.getAvatarData(), // 头像数据
"image/jpeg" // MIME 类型
);
System.out.println("Avatar uploaded for user: " + task.getUserId());
} catch (Exception e) {
e.printStackTrace();
System.err.println("Failed to upload avatar for user: " + task.getUserId());
}
}
}
5. 配置 Minio 客户端:
创建一个配置类来初始化 Minio 客户端,并将其作为 Spring Bean:
java
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MinioConfig {
@Value("${minio.url}")
private String url;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(url)
.credentials(accessKey, secretKey)
.build();
}
}
通过这些步骤,你可以在 Spring Boot 项目中使用 RabbitMQ 和 Minio 实现用户头像的异步上传。你可以根据具体需求进一步调整代码,以满足特定的业务需求。