From e4fe69d8701f90041949607f0ca63beb5c6136ec Mon Sep 17 00:00:00 2001 From: wodeyangzipingpingwuqi Date: Tue, 7 May 2024 16:33:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(sj=5F1.0.0):=201=E3=80=81=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E6=96=B0=E5=A2=9EWebhook=202=E3=80=81asyncSendMessage?= =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E6=94=BE=E7=88=B6=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/attribute/WebhookAttribute.java | 29 ++++++++ .../core/alarm/strategy/AbstractAlarm.java | 20 +++-- .../core/alarm/strategy/DingdingAlarm.java | 6 -- .../core/alarm/strategy/EmailAlarm.java | 21 +++--- .../common/core/alarm/strategy/LarkAlarm.java | 7 -- .../core/alarm/strategy/QiYeWechatAlarm.java | 6 -- .../core/alarm/strategy/WebhookAlarm.java | 73 +++++++++++++++++++ .../common/core/enums/AlarmTypeEnum.java | 5 ++ .../common/core}/enums/ContentTypeEnum.java | 2 +- .../server/common/alarm/AbstractAlarm.java | 2 +- .../workflow/CallbackWorkflowExecutor.java | 7 +- 11 files changed, 132 insertions(+), 46 deletions(-) create mode 100644 snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/attribute/WebhookAttribute.java create mode 100644 snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/WebhookAlarm.java rename {snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common => snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core}/enums/ContentTypeEnum.java (93%) diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/attribute/WebhookAttribute.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/attribute/WebhookAttribute.java new file mode 100644 index 00000000..98ad6a22 --- /dev/null +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/attribute/WebhookAttribute.java @@ -0,0 +1,29 @@ +package com.aizuda.snailjob.common.core.alarm.attribute; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +/** + * @author: opensnail + * @date : 2024-05-07 16:13 + */ +@Data +@Slf4j +public class WebhookAttribute { + + /** + * webhook + */ + private String webhookUrl; + + /** + * 请求类型 + */ + private Integer contentType; + + /** + * 秘钥 + */ + private String secret; + +} diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/AbstractAlarm.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/AbstractAlarm.java index d616069b..bbbd044d 100644 --- a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/AbstractAlarm.java +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/AbstractAlarm.java @@ -2,10 +2,7 @@ package com.aizuda.snailjob.common.core.alarm.strategy; import com.aizuda.snailjob.common.core.alarm.Alarm; import com.aizuda.snailjob.common.core.alarm.SnailJobAlarmFactory; -import com.aizuda.snailjob.common.core.context.SpringContext; -import com.aizuda.snailjob.common.core.util.EnvironmentUtils; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.env.Environment; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -17,10 +14,17 @@ import java.util.concurrent.TimeUnit; */ public abstract class AbstractAlarm implements Alarm, InitializingBean { - protected static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 10, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); + protected static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 10, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); + + @Override + public void afterPropertiesSet() throws Exception { + SnailJobAlarmFactory.register(this); + } + + @Override + public boolean asyncSendMessage(T t) { + threadPoolExecutor.execute(() -> syncSendMessage(t)); + return true; + } - @Override - public void afterPropertiesSet() throws Exception { - SnailJobAlarmFactory.register(this); - } } diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/DingdingAlarm.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/DingdingAlarm.java index 27f23baa..f9c9b8d3 100644 --- a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/DingdingAlarm.java +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/DingdingAlarm.java @@ -21,12 +21,6 @@ public class DingdingAlarm extends AbstractAlarm { return AlarmTypeEnum.DING_DING.getValue(); } - @Override - public boolean asyncSendMessage(AlarmContext context) { - threadPoolExecutor.execute(() -> syncSendMessage(context)); - return true; - } - @Override public boolean syncSendMessage(AlarmContext context) { DingDingAttribute dingDingAttribute = JsonUtil.parseObject(context.getNotifyAttribute(), DingDingAttribute.class); diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/EmailAlarm.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/EmailAlarm.java index 7effc4d3..760226a8 100644 --- a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/EmailAlarm.java +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/EmailAlarm.java @@ -30,12 +30,6 @@ public class EmailAlarm extends AbstractAlarm { return AlarmTypeEnum.EMAIL.getValue(); } - @Override - public boolean asyncSendMessage(AlarmContext alarmContext) { - threadPoolExecutor.execute(() -> syncSendMessage(alarmContext)); - return true; - } - @Override public boolean syncSendMessage(AlarmContext alarmContext) { if (Objects.isNull(mailAccount)) { @@ -43,11 +37,16 @@ public class EmailAlarm extends AbstractAlarm { return false; } - String notifyAttribute = alarmContext.getNotifyAttribute(); - EmailAttribute emailAttribute = JsonUtil.parseObject(notifyAttribute, EmailAttribute.class); - String text = alarmContext.getText(); - text = text.replaceAll("\n", "
"); - MailUtils.send(mailAccount, emailAttribute.getTos(), alarmContext.getTitle(), text, true); + try { + String notifyAttribute = alarmContext.getNotifyAttribute(); + EmailAttribute emailAttribute = JsonUtil.parseObject(notifyAttribute, EmailAttribute.class); + String text = alarmContext.getText(); + text = text.replaceAll("\n", "
"); + MailUtils.send(mailAccount, emailAttribute.getTos(), alarmContext.getTitle(), text, true); + } catch (Exception e) { + SnailJobLog.LOCAL.error("发送email消息失败:", e); + return false; + } return true; } diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/LarkAlarm.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/LarkAlarm.java index 6d2b4f85..5a3fde95 100644 --- a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/LarkAlarm.java +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/LarkAlarm.java @@ -43,13 +43,6 @@ public class LarkAlarm extends AbstractAlarm { return AlarmTypeEnum.LARK.getValue(); } - @Override - public boolean asyncSendMessage(AlarmContext context) { - threadPoolExecutor.execute(() -> syncSendMessage(context)); - - return true; - } - @Override public boolean syncSendMessage(AlarmContext context) { try { diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/QiYeWechatAlarm.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/QiYeWechatAlarm.java index 356941f9..d0feb929 100644 --- a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/QiYeWechatAlarm.java +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/QiYeWechatAlarm.java @@ -33,12 +33,6 @@ public class QiYeWechatAlarm extends AbstractAlarm { return AlarmTypeEnum.WE_COM.getValue(); } - @Override - public boolean asyncSendMessage(AlarmContext context) { - threadPoolExecutor.execute(() -> syncSendMessage(context)); - return true; - } - @Override public boolean syncSendMessage(AlarmContext context) { try { diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/WebhookAlarm.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/WebhookAlarm.java new file mode 100644 index 00000000..6dbb33a0 --- /dev/null +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/WebhookAlarm.java @@ -0,0 +1,73 @@ +package com.aizuda.snailjob.common.core.alarm.strategy; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.aizuda.snailjob.common.core.alarm.AlarmContext; +import com.aizuda.snailjob.common.core.alarm.attribute.WebhookAttribute; +import com.aizuda.snailjob.common.core.enums.AlarmTypeEnum; +import com.aizuda.snailjob.common.core.enums.ContentTypeEnum; +import com.aizuda.snailjob.common.core.util.JsonUtil; +import com.aizuda.snailjob.common.log.SnailJobLog; +import lombok.Builder; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author: opensnail + * @date : 2024-05-07 10:15 + */ +@Component +@RequiredArgsConstructor +public class WebhookAlarm extends AbstractAlarm { + + @Override + public Integer getAlarmType() { + return AlarmTypeEnum.WEBHOOK.getValue(); + } + + @Override + public boolean syncSendMessage(AlarmContext alarmContext) { + + WebhookAttribute webhookAttribute = JsonUtil.parseObject(alarmContext.getNotifyAttribute(), WebhookAttribute.class); + for (int i = 0; i < 2; i++) { + try { + WebhookMessage webhookMessage = WebhookMessage.builder().text(alarmContext.getTitle()).build(); + + HttpRequest post = HttpUtil.createPost(webhookAttribute.getWebhookUrl()); + HttpRequest request = post.body(JsonUtil.toJsonString(webhookMessage), ContentTypeEnum.valueOf(webhookAttribute.getContentType()).getMediaType().toString()) + .header("secret", webhookAttribute.getSecret()); + HttpResponse execute = request.execute(); + if (execute.isOk()) { + return true; + } + SnailJobLog.LOCAL.info("发送Webhook告警结果. webHook:[{}],结果: [{}]", webhookAttribute.getWebhookUrl(), execute.body()); + break; + } catch (Exception e) { + SnailJobLog.LOCAL.error("发送Webhook告警异常. webHook:[{}]", webhookAttribute, e); + } + } + + return true; + } + + @Data + @Builder + private static class WebhookMessage { + + private String text; + } + + @Override + public boolean asyncSendMessage(List alarmContexts) { + for (AlarmContext alarmContext : alarmContexts) { + asyncSendMessage(alarmContext); + } + + return true; + } +} + diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/AlarmTypeEnum.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/AlarmTypeEnum.java index 25de0005..9e245bf7 100644 --- a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/AlarmTypeEnum.java +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/AlarmTypeEnum.java @@ -27,6 +27,11 @@ public enum AlarmTypeEnum { * 飞书 */ LARK(4), + + /** + * Webhook + */ + WEBHOOK(5), ; private final int value; diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/enums/ContentTypeEnum.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/ContentTypeEnum.java similarity index 93% rename from snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/enums/ContentTypeEnum.java rename to snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/ContentTypeEnum.java index bc3228c2..5370e5d7 100644 --- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/enums/ContentTypeEnum.java +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/ContentTypeEnum.java @@ -1,4 +1,4 @@ -package com.aizuda.snailjob.server.common.enums; +package com.aizuda.snailjob.common.core.enums; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/alarm/AbstractAlarm.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/alarm/AbstractAlarm.java index bc82c177..8b7dd9a1 100644 --- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/alarm/AbstractAlarm.java +++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/alarm/AbstractAlarm.java @@ -103,7 +103,7 @@ public abstract class AbstractAlarm notifyConfigs = accessTemplate.getNotifyConfigAccess().list( new LambdaQueryWrapper() .eq(NotifyConfig::getNotifyStatus, StatusEnum.YES.getStatus()) - .in(NotifyConfig::getSystemTaskType, getSystemTaskType()) + .in(NotifyConfig::getSystemTaskType, getSystemTaskType().stream().map(i -> i.getType()).collect(Collectors.toList())) .eq(NotifyConfig::getNotifyScene, getNotifyScene()) .in(NotifyConfig::getNamespaceId, namespaceIds) .in(NotifyConfig::getGroupName, groupNames) diff --git a/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/executor/workflow/CallbackWorkflowExecutor.java b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/executor/workflow/CallbackWorkflowExecutor.java index 6f4a0b76..eaf06b35 100644 --- a/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/executor/workflow/CallbackWorkflowExecutor.java +++ b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/executor/workflow/CallbackWorkflowExecutor.java @@ -2,16 +2,11 @@ package com.aizuda.snailjob.server.job.task.support.executor.workflow; import cn.hutool.core.util.StrUtil; import com.aizuda.snailjob.common.core.constant.SystemConstants; -import com.aizuda.snailjob.common.core.enums.JobOperationReasonEnum; -import com.aizuda.snailjob.common.core.enums.JobTaskBatchStatusEnum; -import com.aizuda.snailjob.common.core.enums.JobTaskStatusEnum; -import com.aizuda.snailjob.common.core.enums.StatusEnum; -import com.aizuda.snailjob.common.core.enums.WorkflowNodeTypeEnum; +import com.aizuda.snailjob.common.core.enums.*; import com.aizuda.snailjob.common.core.util.JsonUtil; import com.aizuda.snailjob.common.log.SnailJobLog; import com.aizuda.snailjob.server.common.rpc.okhttp.RequestInterceptor; import com.aizuda.snailjob.server.common.dto.CallbackConfig; -import com.aizuda.snailjob.server.common.enums.ContentTypeEnum; import com.aizuda.snailjob.server.common.dto.JobLogMetaDTO; import com.aizuda.snailjob.server.job.task.support.WorkflowTaskConverter; import com.aizuda.snailjob.server.model.dto.CallbackParamsDTO;