Commit 03e6690a by zhangxingmin

xxl-job

parent ed904f15
package com.yd.email.api.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
\ No newline at end of file
package com.yd.email.api.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
@ConditionalOnClass(XxlJobSpringExecutor.class)
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.port:9999}")
private int port;
@Value("${xxl.job.accessToken:}")
private String accessToken;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
log.info(">>>>>>>>>>> xxl-job config init. appname: {}, port: {}, accessToken: {}",
appname, port, StringUtils.isNotBlank(accessToken) ? "已配置" : "未配置");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setPort(port);
// 设置accessToken
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogRetentionDays(30);
return xxlJobSpringExecutor;
}
}
\ No newline at end of file
......@@ -27,55 +27,4 @@ public class ApiEmailSendController implements ApiEmailSendFeignClient {
public Result<ApiSendEmailResponse> sendEmail(ApiSendEmailRequest request) {
return apiEmailSendService.sendEmail(request);
}
// @Autowired
// private MailTaskMapper mailTaskMapper;
//
// @Autowired
// private MailRecipientMapper mailRecipientMapper;
//
// @Autowired
// private XxlJobService xxlJobService;
//
// @PostMapping("/send")
// public ResponseResult sendMail(@RequestBody MailSendRequest request) {
// try {
// // 1. 保存邮件任务到数据库
// MailTask mailTask = new MailTask();
// mailTask.setFromAddress(request.getFrom());
// mailTask.setSubject(request.getSubject());
// mailTask.setContent(request.getContent());
// mailTask.setAttachmentPath(request.getAttachmentPath());
// mailTask.setSendTime(request.getSendTime());
// mailTask.setStatus(0);
// mailTaskMapper.insert(mailTask);
//
// Long taskId = mailTask.getId();
//
// // 2. 保存收件人信息
// for (MailSendRequest.Recipient recipient : request.getRecipients()) {
// MailRecipient mailRecipient = new MailRecipient();
// mailRecipient.setTaskId(taskId);
// mailRecipient.setToAddress(recipient.getTo());
// if (recipient.getCc() != null && !recipient.getCc().isEmpty()) {
// mailRecipient.setCcAddresses(String.join(",", recipient.getCc()));
// }
// mailRecipient.setSendStatus(0);
// mailRecipientMapper.insert(mailRecipient);
// }
//
// // 3. 创建XXL-Job定时任务
// String jobId = xxlJobService.addScheduleJob(taskId, request.getSendTime());
//
// return ResponseResult.success("邮件任务创建成功", Map.of(
// "taskId", taskId,
// "jobId", jobId,
// "scheduleTime", request.getSendTime()
// ));
//
// } catch (Exception e) {
// log.error("创建邮件发送任务失败", e);
// return ResponseResult.error("创建任务失败: " + e.getMessage());
// }
// }
}
\ No newline at end of file
package com.yd.email.api.service.impl;
import com.yd.common.enums.CommonEnum;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.DateUtil;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.email.api.service.ApiEmailSendService;
import com.yd.email.api.service.XxlJobService;
import com.yd.email.feign.enums.EmailTaskStatusEnum;
import com.yd.email.feign.request.ApiSendEmailRequest;
import com.yd.email.feign.response.ApiSendEmailResponse;
import com.yd.email.service.model.EmailTask;
import com.yd.email.service.model.EmailTaskRecipients;
import com.yd.email.service.service.IEmailTaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 邮件发送实现类
......@@ -19,6 +31,9 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
@Autowired
private XxlJobService xxlJobService;
@Autowired
private IEmailTaskService iEmailTaskService;
/**
* 发送邮件
* @param request
......@@ -26,44 +41,63 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
*/
@Override
public Result<ApiSendEmailResponse> sendEmail(ApiSendEmailRequest request) {
// try {
// // 1. 保存邮件任务到数据库
// MailTask mailTask = new MailTask();
// mailTask.setFromAddress(request.getFrom());
// mailTask.setSubject(request.getSubject());
// mailTask.setContent(request.getContent());
// mailTask.setAttachmentPath(request.getAttachmentPath());
// mailTask.setSendTime(request.getSendTime());
// mailTask.setStatus(0);
// mailTaskMapper.insert(mailTask);
//
// Long taskId = mailTask.getId();
//
// // 2. 保存收件人信息
// for (MailSendRequest.Recipient recipient : request.getRecipients()) {
// MailRecipient mailRecipient = new MailRecipient();
// mailRecipient.setTaskId(taskId);
// mailRecipient.setToAddress(recipient.getTo());
// if (recipient.getCc() != null && !recipient.getCc().isEmpty()) {
// mailRecipient.setCcAddresses(String.join(",", recipient.getCc()));
// }
// mailRecipient.setSendStatus(0);
// mailRecipientMapper.insert(mailRecipient);
// }
//
// // 3. 创建XXL-Job定时任务
// String jobId = xxlJobService.addScheduleJob(taskId, request.getSendTime());
//
// return ResponseResult.success("邮件任务创建成功", Map.of(
// "taskId", taskId,
// "jobId", jobId,
// "scheduleTime", request.getSendTime()
// ));
//
// } catch (Exception e) {
// log.error("创建邮件发送任务失败", e);
// return ResponseResult.error("创建任务失败: " + e.getMessage());
// }
return null;
ApiSendEmailResponse response = new ApiSendEmailResponse();
try {
//保存邮件任务到数据库
EmailTask mailTask = new EmailTask();
//邮件任务唯一业务ID
mailTask.setTaskBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_EMAIL_TASK.getCode()));
//任务名称:邮件主题 + 邮件发送任务
mailTask.setTaskName(request.getSubject() + "邮件发送任务");
//关联发件人唯一业务ID
mailTask.setSenderBizId(request.getSenderBizId());
//发件人邮箱
mailTask.setSendEmail(request.getSendEmail());
//邮件主题
mailTask.setSubject(request.getSubject());
//邮件内容
mailTask.setContent(request.getContent());
//发送邮件的附件路径(多个用分号分隔)
mailTask.setAttachmentPath(request.getAttachmentPath());
//计划发送时间(为空表示立即发送,不为空表示定时发送)
mailTask.setScheduleTime(request.getScheduleTime());
//任务状态:计划发送时间(为空表示立即发送状态为发送中,不为空表示发送状态为定时发送)
String taskStatus = !Objects.isNull(request.getScheduleTime()) ? EmailTaskStatusEnum.SCHEDULED.getItemValue() : EmailTaskStatusEnum.SENDING.getItemValue();
mailTask.setStatus(taskStatus);
iEmailTaskService.saveOrUpdate(mailTask);
//邮件任务唯一业务ID
String taskBizId = mailTask.getTaskBizId();
// 保存收件人信息
if (!CollectionUtils.isEmpty(request.getRecipientsDtoList())) {
List<EmailTaskRecipients> recipientsList = request.getRecipientsDtoList()
.stream().map(dto -> {
EmailTaskRecipients mailRecipient = new EmailTaskRecipients();
//邮件任务唯一业务ID
mailRecipient.setTaskBizId(taskBizId);
mailRecipient.setStatus(taskStatus);
mailRecipient.setContactBizId(dto.getContactBizId());
mailRecipient.setReceiveEmail(dto.getReceiveEmail());
//抄送人邮箱(多个用分号分隔)
mailRecipient.setCcEmail(!CollectionUtils.isEmpty(dto.getCcEmailList()) ? String.join(";",dto.getCcEmailList()) : "");
return mailRecipient;
}).collect(Collectors.toList());
}
//计划发送时间(为空表示立即发送,不为空表示定时发送)
String jobId = "";
if (!Objects.isNull(request.getScheduleTime())) {
//创建XXL-Job定时任务
jobId = xxlJobService.addScheduleJob(taskBizId, DateUtil.convertDateByLocalDateTime(request.getScheduleTime()));
}
response.setJobId(jobId);
response.setScheduleTime(request.getScheduleTime());
response.setTaskBizId(taskBizId);
return Result.success(response);
} catch (Exception e) {
log.error("创建邮件发送任务失败", e);
throw new BusinessException("创建邮件发送任务失败");
}
}
}
......@@ -44,7 +44,7 @@ spring:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: b3b01715-eb85-4242-992a-5aff03d864d4
namespace: 8fbea9a4-b626-46de-a4e6-9d23f6609318
# nacos的ip地址和端口
server-addr: 139.224.145.34:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
......
package com.yd.email.feign.dto;
import lombok.Data;
import java.util.List;
@Data
public class ApiEmailTaskRecipientsDto {
/**
* 收件人唯一业务ID(联系人唯一业务ID)有就传值,没有就不传值
*/
private String contactBizId;
/**
* 收件人邮箱(单个)
*/
private String receiveEmail;
/**
* 抄送人邮箱(数组)
*/
private List<String> ccEmailList;
}
package com.yd.email.feign.request;
import com.yd.email.feign.dto.ApiEmailTaskRecipientsDto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class ApiSendEmailRequest {
/**
* 发件人唯一业务ID
*/
private String senderBizId;
/**
* 发件人邮箱(单个)
*/
@NotBlank(message = "发件人邮箱不能为空")
......@@ -18,4 +25,25 @@ public class ApiSendEmailRequest {
*/
@NotBlank(message = "邮件主题不能为空")
private String subject;
/**
* 邮件内容
*/
@NotBlank(message = "邮件内容不能为空")
private String content;
/**
* 计划发送时间(为空表示立即发送,不为空表示定时发送)
*/
private LocalDateTime scheduleTime;
/**
* 发送邮件的附件路径(多个用分号分隔)
*/
private String attachmentPath;
/**
* 收件人列表信息
*/
private List<ApiEmailTaskRecipientsDto> recipientsDtoList;
}
......@@ -2,6 +2,17 @@ package com.yd.email.feign.response;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class ApiSendEmailResponse {
private String jobId;
private String taskBizId;
/**
* 计划发送时间(为空表示立即发送,不为空表示定时发送)
*/
private LocalDateTime scheduleTime;
}
......@@ -79,13 +79,13 @@ public class EmailTask implements Serializable {
private String status;
/**
* 计划发送时间(为空表示立即发送)
* 计划发送时间(为空表示立即发送,不为空表示定时发送
*/
@TableField("schedule_time")
private LocalDateTime scheduleTime;
/**
* 实际发送时间
* 实际发送时间(发送成功的时间)
*/
@TableField("send_time")
private LocalDateTime sendTime;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment