[dev] redesign Alarmable interface which is more oo

This commit is contained in:
朱八 2020-08-02 00:38:26 +08:00
parent 986aa712a0
commit 671df61390
8 changed files with 28 additions and 58 deletions

View File

@ -11,7 +11,9 @@ import org.apache.commons.lang3.StringUtils;
* @author tjq
* @since 2020/8/1
*/
public interface AlarmContent extends OmsSerializable {
public interface Alarm extends OmsSerializable {
String fetchTitle();
default String fetchContent() {
StringBuilder sb = new StringBuilder();

View File

@ -12,17 +12,6 @@ import java.util.List;
*/
public interface Alarmable {
/**
* 任务执行失败报警
* @param content 任务实例相关信息
* @param targetUserList 目标用户列表
*/
void onJobInstanceFailed(JobInstanceAlarmContent content, List<UserInfoDO> targetUserList);
void onFailed(Alarm alarm, List<UserInfoDO> targetUserList);
/**
* 工作流执行失败报警
* @param content 工作流实例相关信息
* @param targetUserList 目标用户列表
*/
void onWorkflowInstanceFailed(WorkflowInstanceAlarmContent content, List<UserInfoDO> targetUserList);
}

View File

@ -31,26 +31,9 @@ public class DefaultMailAlarmService implements Alarmable {
private String from;
private static final String FROM_KEY = "spring.mail.username";
private static final String MAIL_TITLE = "PowerJob AlarmService";
private static final String JOB_INSTANCE_FAILED_CONTENT_PATTERN = "Job run failed, detail is: %s";
private static final String WF_INSTANCE_FAILED_CONTENT_PATTERN = "Workflow run failed, detail is: %s";
@Override
public void onJobInstanceFailed(JobInstanceAlarmContent content, List<UserInfoDO> targetUserList) {
String msg = String.format(JOB_INSTANCE_FAILED_CONTENT_PATTERN, content.fetchContent());
sendMail(msg, targetUserList);
}
@Override
public void onWorkflowInstanceFailed(WorkflowInstanceAlarmContent content, List<UserInfoDO> targetUserList) {
String msg = String.format(WF_INSTANCE_FAILED_CONTENT_PATTERN, content.fetchContent());
sendMail(msg, targetUserList);
}
private void sendMail(String msg, List<UserInfoDO> targetUserList) {
public void onFailed(Alarm alarm, List<UserInfoDO> targetUserList) {
initFrom();
log.debug("[OmsMailAlarmService] msg: {}, to: {}", msg, targetUserList);
if (CollectionUtils.isEmpty(targetUserList) || javaMailSender == null || StringUtils.isEmpty(from)) {
return;
}
@ -59,8 +42,8 @@ public class DefaultMailAlarmService implements Alarmable {
try {
sm.setFrom(from);
sm.setTo(targetUserList.stream().map(UserInfoDO::getEmail).toArray(String[]::new));
sm.setSubject(MAIL_TITLE);
sm.setText(msg);
sm.setSubject(alarm.fetchTitle());
sm.setText(alarm.fetchContent());
javaMailSender.send(sm);
}catch (Exception e) {

View File

@ -9,7 +9,7 @@ import lombok.Data;
* @since 2020/4/30
*/
@Data
public class JobInstanceAlarmContent implements AlarmContent {
public class JobInstanceAlarm implements Alarm {
// 应用ID
private long appId;
// 任务ID
@ -43,4 +43,9 @@ public class JobInstanceAlarmContent implements AlarmContent {
private Long finishedTime;
// TaskTracker地址
private String taskTrackerAddress;
@Override
public String fetchTitle() {
return "PowerJob AlarmService: Job Running Failed";
}
}

View File

@ -29,29 +29,14 @@ public class OmsCenterAlarmService implements Alarmable {
private List<Alarmable> alarmableList;
private volatile boolean initialized = false;
public OmsCenterAlarmService() {
}
@Async("omsCommonPool")
@Override
public void onJobInstanceFailed(JobInstanceAlarmContent content, List<UserInfoDO> targetUserList) {
public void onFailed(Alarm alarm, List<UserInfoDO> targetUserList) {
init();
alarmableList.forEach(alarmable -> {
try {
alarmable.onJobInstanceFailed(content, targetUserList);
}catch (Exception e) {
log.warn("[OmsCenterAlarmService] alarm failed.", e);
}
});
}
@Async("omsCommonPool")
@Override
public void onWorkflowInstanceFailed(WorkflowInstanceAlarmContent content, List<UserInfoDO> targetUserList) {
init();
alarmableList.forEach(alarmable -> {
try {
alarmable.onWorkflowInstanceFailed(content, targetUserList);
alarmable.onFailed(alarm, targetUserList);
}catch (Exception e) {
log.warn("[OmsCenterAlarmService] alarm failed.", e);
}
@ -86,4 +71,5 @@ public class OmsCenterAlarmService implements Alarmable {
initialized = true;
}
}
}

View File

@ -10,7 +10,7 @@ import lombok.Data;
* @since 2020/6/12
*/
@Data
public class WorkflowInstanceAlarmContent implements AlarmContent {
public class WorkflowInstanceAlarm implements Alarm {
private String workflowName;
@ -34,4 +34,9 @@ public class WorkflowInstanceAlarmContent implements AlarmContent {
private Integer timeExpressionType;
// 时间表达式CRON/NULL/LONG/LONG
private String timeExpression;
@Override
public String fetchTitle() {
return "PowerJob AlarmService: Workflow Running Failed";
}
}

View File

@ -12,7 +12,7 @@ import com.github.kfcfans.powerjob.server.service.DispatchService;
import com.github.kfcfans.powerjob.server.service.InstanceLogService;
import com.github.kfcfans.powerjob.server.service.UserService;
import com.github.kfcfans.powerjob.server.service.alarm.Alarmable;
import com.github.kfcfans.powerjob.server.service.alarm.JobInstanceAlarmContent;
import com.github.kfcfans.powerjob.server.service.alarm.JobInstanceAlarm;
import com.github.kfcfans.powerjob.server.service.timing.schedule.HashedWheelTimerHolder;
import com.github.kfcfans.powerjob.server.service.workflow.WorkflowInstanceManager;
import lombok.extern.slf4j.Slf4j;
@ -162,12 +162,12 @@ public class InstanceManager {
}
InstanceInfoDO instanceInfo = instanceInfoRepository.findByInstanceId(instanceId);
JobInstanceAlarmContent content = new JobInstanceAlarmContent();
JobInstanceAlarm content = new JobInstanceAlarm();
BeanUtils.copyProperties(jobInfo, content);
BeanUtils.copyProperties(instanceInfo, content);
List<UserInfoDO> userList = SpringUtils.getBean(UserService.class).fetchNotifyUserList(jobInfo.getNotifyUserIds());
omsCenterAlarmService.onJobInstanceFailed(content, userList);
omsCenterAlarmService.onFailed(content, userList);
}
// 主动移除缓存减小内存占用

View File

@ -20,7 +20,7 @@ import com.github.kfcfans.powerjob.server.persistence.core.repository.WorkflowIn
import com.github.kfcfans.powerjob.server.service.DispatchService;
import com.github.kfcfans.powerjob.server.service.UserService;
import com.github.kfcfans.powerjob.server.service.alarm.Alarmable;
import com.github.kfcfans.powerjob.server.service.alarm.WorkflowInstanceAlarmContent;
import com.github.kfcfans.powerjob.server.service.alarm.WorkflowInstanceAlarm;
import com.github.kfcfans.powerjob.server.service.id.IdGenerateService;
import com.github.kfcfans.powerjob.server.service.instance.InstanceService;
import com.google.common.collect.LinkedListMultimap;
@ -332,14 +332,14 @@ public class WorkflowInstanceManager {
// 报警
try {
workflowInfoRepository.findById(wfInstance.getWorkflowId()).ifPresent(wfInfo -> {
WorkflowInstanceAlarmContent content = new WorkflowInstanceAlarmContent();
WorkflowInstanceAlarm content = new WorkflowInstanceAlarm();
BeanUtils.copyProperties(wfInfo, content);
BeanUtils.copyProperties(wfInstance, content);
content.setResult(result);
List<UserInfoDO> userList = userService.fetchNotifyUserList(wfInfo.getNotifyUserIds());
omsCenterAlarmService.onWorkflowInstanceFailed(content, userList);
omsCenterAlarmService.onFailed(content, userList);
});
}catch (Exception ignore) {
}