diff --git a/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyItem.java b/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyItem.java index fa9c173520d0a11e07ba71602964ba987e703997..7bb486e6cdf737d255e65cc7eea586212e73ee06 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyItem.java +++ b/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyItem.java @@ -68,6 +68,11 @@ public class NotifyItem { */ private int clusterLimit = 1; + /** + * Receivers, split by , If NotifyPlatform.receivers have a value, they will be overwritten by the thread pool alarm + */ + private String receivers; + public static List mergeSimpleNotifyItems(List source) { // update notify items if (CollectionUtils.isEmpty(source)) { diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/AbstractDtpNotifier.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/AbstractDtpNotifier.java index e9d940eee2e4d83d1cd8f3148947102c69c5a314..307d876536fcece2940b3ecea9afd363df4cd70c 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/AbstractDtpNotifier.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/AbstractDtpNotifier.java @@ -17,6 +17,7 @@ package org.dromara.dynamictp.core.notifier; +import cn.hutool.core.util.StrUtil; import org.dromara.dynamictp.common.constant.DynamicTpConst; import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.em.NotifyPlatformEnum; @@ -145,7 +146,7 @@ public abstract class AbstractDtpNotifier implements DtpNotifier { alarmCounter.getRight(), Optional.ofNullable(context.getAlarmInfo()).map(AlarmInfo::getLastAlarmTime).orElse(DynamicTpConst.UNKNOWN), DateUtil.now(), - getReceives(platform.getPlatform(), platform.getReceivers()), + getReceives(platform.getPlatform(), StrUtil.isBlank(notifyItem.getReceivers()) ? platform.getReceivers() : notifyItem.getReceivers()), Optional.ofNullable(MDC.get(DynamicTpConst.TRACE_ID)).orElse(DynamicTpConst.UNKNOWN), notifyItem.getInterval() ); diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/base/AbstractHttpNotifier.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/AbstractHttpNotifier.java new file mode 100644 index 0000000000000000000000000000000000000000..c8a1f793c0b4c4e43da04ed34d50e56c34a38c83 --- /dev/null +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/AbstractHttpNotifier.java @@ -0,0 +1,55 @@ +package org.dromara.dynamictp.core.notifier.base; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import lombok.extern.slf4j.Slf4j; +import lombok.var; +import org.dromara.dynamictp.common.entity.NotifyPlatform; + +import java.util.Objects; + +/** + * The notification is sent over http + * + * @author kyao + * @since 1.1.3 + */ +@Slf4j +public abstract class AbstractHttpNotifier extends AbstractNotifier{ + + /** + * Message sending mode + * @author kyao + * @param platform + * @param content + */ + @Override + protected void sendMode(NotifyPlatform platform, String content) { + var url = buildUrl(platform); + var msgBody = buildMsgBody(platform, content); + HttpResponse response = HttpRequest.post(url).body(msgBody).execute(); + if (Objects.nonNull(response)) { + log.info("DynamicTp notify, {} send success, response: {}, request: {}", + platform(), response.body(), msgBody); + } + } + + /** + * build http message body + * @author hanli + * @param platform + * @param content + * @return java.lang.String + */ + protected abstract String buildMsgBody(NotifyPlatform platform, String content); + + /** + * build http url + * @author hanli + * @date 2023/6/25 12:09 PM + * @param platform + * @return java.lang.String + */ + protected abstract String buildUrl(NotifyPlatform platform); + +} diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/base/AbstractNotifier.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/AbstractNotifier.java new file mode 100644 index 0000000000000000000000000000000000000000..71b8ba58705fe6cdd9507fdcf0daa0e2d4ec8569 --- /dev/null +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/AbstractNotifier.java @@ -0,0 +1,53 @@ +package org.dromara.dynamictp.core.notifier.base; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.common.entity.NotifyItem; +import org.dromara.dynamictp.common.entity.NotifyPlatform; +import org.dromara.dynamictp.core.notifier.context.BaseNotifyCtx; +import org.dromara.dynamictp.core.notifier.context.DtpNotifyCtxHolder; + +import java.util.Optional; + +/** + * AbstractNotifier related + * + * @author kyao + * @since 1.1.3 + */ +@Slf4j +public abstract class AbstractNotifier implements Notifier { + + @Override + public final void send(NotifyPlatform platform, String content) { + try { + sendMode(platform, content); + } catch (Exception e) { + log.error(StrUtil.format("DynamicTp notify, {} send failed...", platform()), e); + } + } + + /** + * Message sending mode + * @author kyao + * @param platform + * @param content + */ + protected abstract void sendMode(NotifyPlatform platform, String content); + + /** + * Get the notifyItem.receivers + * @param platform platform + * @return Receivers + */ + protected String[] getNotifyItemReceivers(NotifyPlatform platform) { + BaseNotifyCtx context = DtpNotifyCtxHolder.get(); + String receivers = Optional.ofNullable(context) + .map(BaseNotifyCtx::getNotifyItem) + .map(NotifyItem::getReceivers) + .orElse(null); + receivers = StrUtil.isBlank(receivers) ? platform.getReceivers() : receivers; + return receivers.split(","); + } + +} diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/base/DingNotifier.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/DingNotifier.java index e90ec8f75097b14cb2e6d1e2ca31a1f818f0d752..03e0b7ac040169707d03e17bc211e21f121b8ef9 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/base/DingNotifier.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/DingNotifier.java @@ -17,8 +17,6 @@ package org.dromara.dynamictp.core.notifier.base; -import cn.hutool.http.HttpRequest; -import cn.hutool.http.HttpResponse; import org.dromara.dynamictp.common.constant.DingNotifyConst; import org.dromara.dynamictp.common.entity.MarkdownReq; import org.dromara.dynamictp.common.entity.NotifyPlatform; @@ -32,7 +30,6 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.util.List; -import java.util.Objects; import static org.dromara.dynamictp.common.constant.DingNotifyConst.DING_NOTICE_TITLE; @@ -43,7 +40,7 @@ import static org.dromara.dynamictp.common.constant.DingNotifyConst.DING_NOTICE_ * @since 1.0.0 **/ @Slf4j -public class DingNotifier implements Notifier { +public class DingNotifier extends AbstractHttpNotifier { @Override public String platform() { @@ -51,21 +48,29 @@ public class DingNotifier implements Notifier { } /** - * Execute real ding send. - * - * @param platform send platform - * @param text send content + * Build target url. + * @param secret secret + * @param accessToken accessToken + * @return url */ - @Override - public void send(NotifyPlatform platform, String text) { + private String getTargetUrl(String secret, String accessToken) { + if (StringUtils.isBlank(secret)) { + return DingNotifyConst.DING_WEBHOOK + accessToken; + } + long timestamp = TimeUtil.currentTimeMillis(); + String sign = DingSignUtil.dingSign(secret, timestamp); + return DingNotifyConst.DING_WEBHOOK + accessToken + "×tamp=" + timestamp + "&sign=" + sign; + } + @Override + protected String buildMsgBody(NotifyPlatform platform, String content) { MarkdownReq.Markdown markdown = new MarkdownReq.Markdown(); markdown.setTitle(DING_NOTICE_TITLE); - markdown.setText(text); + markdown.setText(content); MarkdownReq.At at = new MarkdownReq.At(); - List mobiles = Lists.newArrayList(StringUtils.split(platform.getReceivers(), ',')); + List mobiles = Lists.newArrayList(getNotifyItemReceivers(platform)); at.setAtMobiles(mobiles); if (CollectionUtils.isEmpty(mobiles)) { at.setAtAll(true); @@ -75,31 +80,11 @@ public class DingNotifier implements Notifier { markdownReq.setMsgtype("markdown"); markdownReq.setMarkdown(markdown); markdownReq.setAt(at); - - String hookUrl = getTargetUrl(platform.getSecret(), platform.getUrlKey()); - try { - HttpResponse response = HttpRequest.post(hookUrl).body(JsonUtil.toJson(markdownReq)).execute(); - if (Objects.nonNull(response)) { - log.info("DynamicTp notify, ding send success, response: {}, request: {}", - response.body(), JsonUtil.toJson(markdownReq)); - } - } catch (Exception e) { - log.error("DynamicTp notify, ding send failed...", e); - } + return JsonUtil.toJson(markdownReq); } - /** - * Build target url. - * @param secret secret - * @param accessToken accessToken - * @return url - */ - private String getTargetUrl(String secret, String accessToken) { - if (StringUtils.isBlank(secret)) { - return DingNotifyConst.DING_WEBHOOK + accessToken; - } - long timestamp = TimeUtil.currentTimeMillis(); - String sign = DingSignUtil.dingSign(secret, timestamp); - return DingNotifyConst.DING_WEBHOOK + accessToken + "×tamp=" + timestamp + "&sign=" + sign; + @Override + protected String buildUrl(NotifyPlatform platform) { + return getTargetUrl(platform.getSecret(), platform.getUrlKey()); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/base/LarkNotifier.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/LarkNotifier.java index db1f1f2d366f8f131af72fa911194acef7d37477..806f58410bc23ca7e704623cd11b4f11c6f173b1 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/base/LarkNotifier.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/LarkNotifier.java @@ -17,8 +17,6 @@ package org.dromara.dynamictp.core.notifier.base; -import cn.hutool.http.HttpRequest; -import cn.hutool.http.HttpResponse; import org.dromara.dynamictp.common.constant.LarkNotifyConst; import org.dromara.dynamictp.common.entity.NotifyPlatform; import org.dromara.dynamictp.common.em.NotifyPlatformEnum; @@ -33,7 +31,6 @@ import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; -import java.util.Objects; import static org.dromara.dynamictp.common.constant.LarkNotifyConst.SIGN_PARAM; import static org.dromara.dynamictp.common.constant.LarkNotifyConst.SIGN_REPLACE; @@ -46,7 +43,7 @@ import static org.dromara.dynamictp.common.constant.LarkNotifyConst.SIGN_REPLACE * @since 2022/4/28 23:25 */ @Slf4j -public class LarkNotifier implements Notifier { +public class LarkNotifier extends AbstractHttpNotifier { /** * LF @@ -63,34 +60,6 @@ public class LarkNotifier implements Notifier { return NotifyPlatformEnum.LARK.name().toLowerCase(); } - /** - * Execute real Lark send. - * - * @param notifyPlatform {@link NotifyPlatform} - * @param text send content - */ - @Override - public void send(NotifyPlatform notifyPlatform, String text) { - String serverUrl = LarkNotifyConst.LARK_WEBHOOK + notifyPlatform.getUrlKey(); - if (StringUtils.isNotBlank(notifyPlatform.getSecret())) { - try { - val secondsTimestamp = TimeUtil.currentTimeSeconds(); - val sign = genSign(notifyPlatform.getSecret(), secondsTimestamp); - text = text.replace(SIGN_REPLACE, String.format(SIGN_PARAM, secondsTimestamp, sign)); - } catch (NoSuchAlgorithmException | InvalidKeyException e) { - log.error("DynamicTp notify, lark generate signature failed...", e); - } - } - try { - HttpResponse response = HttpRequest.post(serverUrl).body(text).execute(); - if (Objects.nonNull(response)) { - log.info("DynamicTp notify, lark send success, response: {}, request:{}", response.body(), text); - } - } catch (Exception e) { - log.error("DynamicTp notify, lark send failed...", e); - } - } - /** * get signature * @@ -107,4 +76,23 @@ public class LarkNotifier implements Notifier { byte[] signData = mac.doFinal(new byte[]{}); return new String(Base64.encodeBase64(signData)); } + + @Override + protected String buildMsgBody(NotifyPlatform platform, String content) { + if (StringUtils.isNotBlank(platform.getSecret())) { + try { + val secondsTimestamp = TimeUtil.currentTimeSeconds(); + val sign = genSign(platform.getSecret(), secondsTimestamp); + content = content.replace(SIGN_REPLACE, String.format(SIGN_PARAM, secondsTimestamp, sign)); + } catch (NoSuchAlgorithmException | InvalidKeyException e) { + log.error("DynamicTp notify, lark generate signature failed...", e); + } + } + return content; + } + + @Override + protected String buildUrl(NotifyPlatform platform) { + return LarkNotifyConst.LARK_WEBHOOK + platform.getUrlKey(); + } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/base/Notifier.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/Notifier.java index a4187a4d00b0e043a9b758ad2516cad10dcfecef..f2754ed45703b27c64bbe38a2151b4fab66374c8 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/base/Notifier.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/Notifier.java @@ -38,7 +38,8 @@ public interface Notifier { * Send message. * * @param platform platform - * @param content content + * @param content content */ void send(NotifyPlatform platform, String content); + } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/base/WechatNotifier.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/WechatNotifier.java index a0603fb962d7d617e9b493a867a8733793b52159..f4a635ee882e271cd3bece593ba10cd721154622 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/base/WechatNotifier.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/base/WechatNotifier.java @@ -35,36 +35,25 @@ import java.util.Objects; * @since 1.0.0 **/ @Slf4j -public class WechatNotifier implements Notifier { +public class WechatNotifier extends AbstractHttpNotifier { @Override public String platform() { return NotifyPlatformEnum.WECHAT.name().toLowerCase(); } - /** - * Execute real wechat send. - * - * @param platform send platform - * @param text send content - */ @Override - public void send(NotifyPlatform platform, String text) { - String serverUrl = WechatNotifyConst.WECHAT_WEB_HOOK + platform.getUrlKey(); + protected String buildMsgBody(NotifyPlatform platform, String content) { MarkdownReq markdownReq = new MarkdownReq(); markdownReq.setMsgtype("markdown"); MarkdownReq.Markdown markdown = new MarkdownReq.Markdown(); - markdown.setContent(text); + markdown.setContent(content); markdownReq.setMarkdown(markdown); + return JsonUtil.toJson(markdownReq); + } - try { - HttpResponse response = HttpRequest.post(serverUrl).body(JsonUtil.toJson(markdownReq)).execute(); - if (Objects.nonNull(response)) { - log.info("DynamicTp notify, wechat send success, response: {}, request:{}", - response.body(), JsonUtil.toJson(markdownReq)); - } - } catch (Exception e) { - log.error("DynamicTp notify, wechat send failed...", e); - } + @Override + protected String buildUrl(NotifyPlatform platform) { + return WechatNotifyConst.WECHAT_WEB_HOOK + platform.getUrlKey(); } } diff --git a/extension/extension-notify-email/src/main/java/org/dromara/dynamictp/extension/notify/email/EmailNotifier.java b/extension/extension-notify-email/src/main/java/org/dromara/dynamictp/extension/notify/email/EmailNotifier.java index f072d1f4c82475c9a929a40e99a648aa5ada1178..c7293dba065fb9afe32f7198c569455ae5de489b 100644 --- a/extension/extension-notify-email/src/main/java/org/dromara/dynamictp/extension/notify/email/EmailNotifier.java +++ b/extension/extension-notify-email/src/main/java/org/dromara/dynamictp/extension/notify/email/EmailNotifier.java @@ -17,9 +17,10 @@ package org.dromara.dynamictp.extension.notify.email; +import lombok.SneakyThrows; import org.dromara.dynamictp.common.entity.NotifyPlatform; import org.dromara.dynamictp.common.em.NotifyPlatformEnum; -import org.dromara.dynamictp.core.notifier.base.Notifier; +import org.dromara.dynamictp.core.notifier.base.AbstractNotifier; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.javamail.JavaMailSender; @@ -38,7 +39,7 @@ import java.util.Date; * @since 1.0.8 */ @Slf4j -public class EmailNotifier implements Notifier { +public class EmailNotifier extends AbstractNotifier { @Value("${spring.mail.username}") private String sendFrom; @@ -57,21 +58,18 @@ public class EmailNotifier implements Notifier { return NotifyPlatformEnum.EMAIL.name().toLowerCase(); } + @SneakyThrows @Override - public void send(NotifyPlatform platform, String content) { - try { - MimeMessage mimeMessage = javaMailSender.createMimeMessage(); - MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); - messageHelper.setSubject(title); - messageHelper.setFrom(sendFrom); - messageHelper.setTo(platform.getReceivers().split(",")); - messageHelper.setSentDate(new Date()); - messageHelper.setText(content, true); - javaMailSender.send(mimeMessage); - log.info("DynamicTp notify, email send success."); - } catch (Exception e) { - log.error("DynamicTp notify, email send failed...", e); - } + protected void sendMode(NotifyPlatform platform, String content) { + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); + MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); + messageHelper.setSubject(title); + messageHelper.setFrom(sendFrom); + messageHelper.setTo(getNotifyItemReceivers(platform)); + messageHelper.setSentDate(new Date()); + messageHelper.setText(content, true); + javaMailSender.send(mimeMessage); + log.info("DynamicTp notify, {} send success.", platform()); } public String processTemplateContent(String template, Context context) {