邮箱创建时间打标与自动删除功能设计思路
邮箱创建时间打标与自动删除功能设计思路
🎯 问题背景
在邮件处理系统中,收件人邮箱数量会随时间无限增长,导致内存泄漏和性能下降。需要设计一个自动管理机制来解决这个问题。
🏗️ 设计方案
核心数据结构
// 邮箱创建时间映射表
private final Map<String, Long> emailCreationTimestamps = new ConcurrentHashMap<>();// 收件人邮箱映射表
private final Map<String, List<EmailMessage>> recipientEmailMap = new ConcurrentHashMap<>();// 保留时间配置
private static final long EMAIL_RETENTION_TIME = 24 * 60 * 60 * 1000; // 1天
设计思路
- 创建时间打标:新邮箱首次出现时记录时间戳
- 自动清理:每次处理邮件后检查过期邮箱
- 批量删除:一次性删除所有过期邮箱
- 异步处理:服务器删除操作异步执行
🔧 核心实现
1. 邮箱创建时间打标
private void processEmailGrouping(List<EmailMessage> newEmails) {long currentTime = System.currentTimeMillis();recipientEmailGroupMap.forEach((recipientEmail, emails) -> {// 检查是否是新邮箱if (!recipientEmailMap.containsKey(recipientEmail)) {// 记录新邮箱的创建时间emailCreationTimestamps.put(recipientEmail, currentTime);log.debug("新邮箱 {} 创建时间: {}", recipientEmail, new Date(currentTime));}recipientEmailMap.computeIfAbsent(recipientEmail, k -> new ArrayList<>()).addAll(emails);});
}
2. 自动删除过期邮箱
private void cleanupExpiredEmails() {long currentTime = System.currentTimeMillis();Set<String> expiredEmails = findExpiredEmails(currentTime);if (!expiredEmails.isEmpty()) {performEmailCleanup(expiredEmails);}
}private Set<String> findExpiredEmails(long currentTime) {return emailCreationTimestamps.entrySet().stream().filter(entry -> (currentTime - entry.getValue()) > EMAIL_RETENTION_TIME).map(Map.Entry::getKey).collect(Collectors.toSet());
}
3. 邮箱删除机制
public boolean deleteRecipientEmail(String recipientEmail) {try {List<EmailMessage> emailsToDelete = recipientEmailMap.get(recipientEmail);if (ObjectUtils.isNotEmpty(emailsToDelete)) {// 删除邮件ID// 取出idSet<String> messageIds = emailsToDelete.stream().map(EmailMessage::getMessageId).collect(Collectors.toSet());processedMessageIds.removeAll(messageIds);// 删除内存中的邮箱recipientEmailMap.remove(recipientEmail);// 删除创建时间emailCreationTimestamps.remove(recipientEmail);// 异步删除服务器邮件deleteEmailsFromServerAsync(recipientEmail);}return true;} catch (Exception e) {log.error("删除邮箱 {} 时发生错误", recipientEmail, e);return false;}
}
📊 监控统计
public Map<String, Object> getProcessingStats() {Map<String, Object> stats = new ConcurrentHashMap<>();int totalEmailCount = recipientEmailMap.values().stream().mapToInt(List::size).sum();stats.put("processedMessageCount", processedMessageIds.size());stats.put("recipientEmailCount", recipientEmailMap.size());stats.put("totalEmailCount", totalEmailCount);stats.put("emailCreationTimestampCount", emailCreationTimestamps.size());return stats;
}
🚀 工作流程设计
1. 新邮箱创建流程
2. 自动清理流程
3. 邮箱删除详细流程
4. 整体系统工作流程
5. 数据流转关系图
📝 使用示例
// 获取统计信息
Map<String, Object> stats = defaultEmailMonitorService.getProcessingStats();
System.out.println("邮箱数量: " + stats.get("recipientEmailCount"));// 获取所有邮箱
List<String> allEmails = defaultEmailMonitorService.getAllRecipientEmails();// 删除指定邮箱
boolean success = defaultEmailMonitorService.deleteRecipientEmail("user@example.com");