PowerJob之邮件报警配置
文档地址:点击这里
配置文件
spring.mail.host=smtp.163.com
spring.mail.username=becant223@163.com
# 这里不是邮箱密码,而是授权码,通过下面方式获取
spring.mail.password=xxxxxxxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
配置文件配置的是 发送邮件的邮箱
获取授权码
1.打开163邮箱官网,登录
2.点击顶部栏设置 —> POP3/SMTP/IMAP
3.开启 POP3/SMTP服务
报警用户录入
图片显示的邮件地址是 接收邮件的地址,(如果录入的是qq邮箱而且接收不到邮件,可以去垃圾箱看一看~~)
代码解析
1.单机执行
任务信息:
当任务执行失败时,经过一系列的方法,然后会进入processFinishedInstance()方法。
alert()方法
@Slf4j
@Service
@RequiredArgsConstructor
public class InstanceManager implements TransportServiceAware {
// 构造注入
private final AlarmCenter alarmCenter;
private void alert(Long instanceId, String alertContent) {
log.info("alert=--==-=--=-==-=--=-==--==-=--=-==--==-=-=-=-");
// 根据instanceId获取任务运行日志表
InstanceInfoDO instanceInfo = instanceInfoRepository.findByInstanceId(instanceId);
// 任务信息表
JobInfoDO jobInfo;
try {
// fetchJobInfoByInstanceId(instanceId):根据 instanceId 获取 JobInfo
jobInfo = instanceMetadataService.fetchJobInfoByInstanceId(instanceId);
} catch (Exception e) {
log.warn("[InstanceManager-{}] can't find jobInfo, alarm failed.", instanceId);
return;
}
// 获取任务执行失败告警对象
JobInstanceAlarm content = new JobInstanceAlarm();
// 设置信息
BeanUtils.copyProperties(jobInfo, content);
BeanUtils.copyProperties(instanceInfo, content);
// fetchNotifyUserList(jobInfo.getNotifyUserIds()):根据用户ID字符串获取用户信息详细列表
List<UserInfoDO> userList = SpringUtils.getBean(UserService.class).fetchNotifyUserList(jobInfo.getNotifyUserIds());
if (!StringUtils.isEmpty(alertContent)) {
content.setResult(alertContent);
}
alarmCenter.alarmFailed(content, AlarmUtils.convertUserInfoList2AlarmTargetList(userList));
}
}
AlarmCenter类
@Slf4j
@Component
public class AlarmCenter {
private final ExecutorService POOL;
private final List<Alarmable> BEANS = Lists.newLinkedList();
// 用于构造注入,参数为Alarmble的实现类(DingTalkAlarmService,MailAlarmService,WebHookAlarmService)
public AlarmCenter(List<Alarmable> alarmables) {
int cores = Runtime.getRuntime().availableProcessors();
ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("AlarmPool-%d").build();
POOL = new ThreadPoolExecutor(cores, cores, 5, TimeUnit.MINUTES, Queues.newLinkedBlockingQueue(), factory);
alarmables.forEach(bean -> {
BEANS.add(bean);
log.info("[AlarmCenter] bean(className={},obj={}) register to AlarmCenter successfully!", bean.getClass().getName(), bean);
});
}
public void alarmFailed(Alarm alarm, List<AlarmTarget> alarmTargets) {
log.info("alarmFailed=--==-=--=-==-=--=-==--==-=--=-==--==-=-=-=-");
// 录入警告信息时,只录入了邮件,而没有录入WebHook和钉钉
// 故不会进入到DingTalkAlarmService.onFailed()和WebHookAlarmService.onFailed()
// 只进入MailAlarmService.onFailed()
POOL.execute(() -> BEANS.forEach(alarmable -> {
try {
log.info("alarmable:{}", alarmable);
alarmable.onFailed(alarm, alarmTargets);
}catch (Exception e) {
log.warn("[AlarmCenter] alarm failed.", e);
}
}));
}
}
MailAlarmService类
/**
* 邮件通知服务
*
* @author tjq
* @since 2020/4/30
*/
@Slf4j
@Service
public class MailAlarmService implements Alarmable {
@Resource
private Environment environment;
private JavaMailSender javaMailSender;
@Value("${spring.mail.username:''}")
private String from;
@Override
public void onFailed(Alarm alarm, List<AlarmTarget> targetUserList) {
log.info("onFailed=--==-=--=-==-=--=-==--==-=--=-==--==-=-=-=-");
log.info("javaMailSender:{}", javaMailSender);
if (CollectionUtils.isEmpty(targetUserList) || javaMailSender == null || StringUtils.isEmpty(from)) {
return;
}
SimpleMailMessage sm = new SimpleMailMessage();
try {
sm.setFrom(from);
sm.setTo(targetUserList.stream().map(AlarmTarget::getEmail).filter(Objects::nonNull).filter(email -> !email.isEmpty()).toArray(String[]::new));
sm.setSubject(alarm.fetchTitle());
sm.setText(alarm.fetchContent());
javaMailSender.send(sm);
}catch (Exception e) {
log.warn("[MailAlarmService] send mail failed, reason is {}", e.getMessage());
}
}
@Autowired(required = false)
public void setJavaMailSender(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
}
}
当任务失败后,控制台的输出:
往下滑~~~~
大致流程就是这样了~
PowerJob之邮件报警配置
http://example.com/2024/04/18/PowerJob之邮件报警配置/