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 { ...@@ -27,55 +27,4 @@ public class ApiEmailSendController implements ApiEmailSendFeignClient {
public Result<ApiSendEmailResponse> sendEmail(ApiSendEmailRequest request) { public Result<ApiSendEmailResponse> sendEmail(ApiSendEmailRequest request) {
return apiEmailSendService.sendEmail(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; 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.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.ApiEmailSendService;
import com.yd.email.api.service.XxlJobService; 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.request.ApiSendEmailRequest;
import com.yd.email.feign.response.ApiSendEmailResponse; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; 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 { ...@@ -19,6 +31,9 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
@Autowired @Autowired
private XxlJobService xxlJobService; private XxlJobService xxlJobService;
@Autowired
private IEmailTaskService iEmailTaskService;
/** /**
* 发送邮件 * 发送邮件
* @param request * @param request
...@@ -26,44 +41,63 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService { ...@@ -26,44 +41,63 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
*/ */
@Override @Override
public Result<ApiSendEmailResponse> sendEmail(ApiSendEmailRequest request) { public Result<ApiSendEmailResponse> sendEmail(ApiSendEmailRequest request) {
// try { ApiSendEmailResponse response = new ApiSendEmailResponse();
// // 1. 保存邮件任务到数据库 try {
// MailTask mailTask = new MailTask(); //保存邮件任务到数据库
// mailTask.setFromAddress(request.getFrom()); EmailTask mailTask = new EmailTask();
// mailTask.setSubject(request.getSubject()); //邮件任务唯一业务ID
// mailTask.setContent(request.getContent()); mailTask.setTaskBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_EMAIL_TASK.getCode()));
// mailTask.setAttachmentPath(request.getAttachmentPath()); //任务名称:邮件主题 + 邮件发送任务
// mailTask.setSendTime(request.getSendTime()); mailTask.setTaskName(request.getSubject() + "邮件发送任务");
// mailTask.setStatus(0); //关联发件人唯一业务ID
// mailTaskMapper.insert(mailTask); mailTask.setSenderBizId(request.getSenderBizId());
// //发件人邮箱
// Long taskId = mailTask.getId(); mailTask.setSendEmail(request.getSendEmail());
// //邮件主题
// // 2. 保存收件人信息 mailTask.setSubject(request.getSubject());
// for (MailSendRequest.Recipient recipient : request.getRecipients()) { //邮件内容
// MailRecipient mailRecipient = new MailRecipient(); mailTask.setContent(request.getContent());
// mailRecipient.setTaskId(taskId); //发送邮件的附件路径(多个用分号分隔)
// mailRecipient.setToAddress(recipient.getTo()); mailTask.setAttachmentPath(request.getAttachmentPath());
// if (recipient.getCc() != null && !recipient.getCc().isEmpty()) { //计划发送时间(为空表示立即发送,不为空表示定时发送)
// mailRecipient.setCcAddresses(String.join(",", recipient.getCc())); mailTask.setScheduleTime(request.getScheduleTime());
// } //任务状态:计划发送时间(为空表示立即发送状态为发送中,不为空表示发送状态为定时发送)
// mailRecipient.setSendStatus(0); String taskStatus = !Objects.isNull(request.getScheduleTime()) ? EmailTaskStatusEnum.SCHEDULED.getItemValue() : EmailTaskStatusEnum.SENDING.getItemValue();
// mailRecipientMapper.insert(mailRecipient); mailTask.setStatus(taskStatus);
// } iEmailTaskService.saveOrUpdate(mailTask);
//
// // 3. 创建XXL-Job定时任务 //邮件任务唯一业务ID
// String jobId = xxlJobService.addScheduleJob(taskId, request.getSendTime()); String taskBizId = mailTask.getTaskBizId();
//
// return ResponseResult.success("邮件任务创建成功", Map.of( // 保存收件人信息
// "taskId", taskId, if (!CollectionUtils.isEmpty(request.getRecipientsDtoList())) {
// "jobId", jobId, List<EmailTaskRecipients> recipientsList = request.getRecipientsDtoList()
// "scheduleTime", request.getSendTime() .stream().map(dto -> {
// )); EmailTaskRecipients mailRecipient = new EmailTaskRecipients();
// //邮件任务唯一业务ID
// } catch (Exception e) { mailRecipient.setTaskBizId(taskBizId);
// log.error("创建邮件发送任务失败", e); mailRecipient.setStatus(taskStatus);
// return ResponseResult.error("创建任务失败: " + e.getMessage()); mailRecipient.setContactBizId(dto.getContactBizId());
// } mailRecipient.setReceiveEmail(dto.getReceiveEmail());
return null; //抄送人邮箱(多个用分号分隔)
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: ...@@ -44,7 +44,7 @@ spring:
# 配置中心 # 配置中心
config: config:
# 命名空间id(此处不用public,因public初始化的空间, id为空) # 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: b3b01715-eb85-4242-992a-5aff03d864d4 namespace: 8fbea9a4-b626-46de-a4e6-9d23f6609318
# nacos的ip地址和端口 # nacos的ip地址和端口
server-addr: 139.224.145.34:8848 server-addr: 139.224.145.34:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置 # 这个就表示 在我们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; package com.yd.email.feign.request;
import com.yd.email.feign.dto.ApiEmailTaskRecipientsDto;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
import java.util.List;
@Data @Data
public class ApiSendEmailRequest { public class ApiSendEmailRequest {
/** /**
* 发件人唯一业务ID
*/
private String senderBizId;
/**
* 发件人邮箱(单个) * 发件人邮箱(单个)
*/ */
@NotBlank(message = "发件人邮箱不能为空") @NotBlank(message = "发件人邮箱不能为空")
...@@ -18,4 +25,25 @@ public class ApiSendEmailRequest { ...@@ -18,4 +25,25 @@ public class ApiSendEmailRequest {
*/ */
@NotBlank(message = "邮件主题不能为空") @NotBlank(message = "邮件主题不能为空")
private String subject; 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; ...@@ -2,6 +2,17 @@ package com.yd.email.feign.response;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime;
@Data @Data
public class ApiSendEmailResponse { public class ApiSendEmailResponse {
private String jobId;
private String taskBizId;
/**
* 计划发送时间(为空表示立即发送,不为空表示定时发送)
*/
private LocalDateTime scheduleTime;
} }
...@@ -79,13 +79,13 @@ public class EmailTask implements Serializable { ...@@ -79,13 +79,13 @@ public class EmailTask implements Serializable {
private String status; private String status;
/** /**
* 计划发送时间(为空表示立即发送) * 计划发送时间(为空表示立即发送,不为空表示定时发送
*/ */
@TableField("schedule_time") @TableField("schedule_time")
private LocalDateTime scheduleTime; private LocalDateTime scheduleTime;
/** /**
* 实际发送时间 * 实际发送时间(发送成功的时间)
*/ */
@TableField("send_time") @TableField("send_time")
private LocalDateTime sendTime; 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