Merge pull request #35 from lingting-gzm/master

🐛 修复异常消息重复通知
This commit is contained in:
b2baccline
2020-09-09 14:23:17 +08:00
3 changed files with 40 additions and 18 deletions

View File

@@ -123,6 +123,7 @@ public abstract class AbstractNoticeGlobalExceptionHandler extends Thread
log.error("消息通知时发生异常", e);
}
});
messages.clear();
}
interval.restart();
}

View File

@@ -2,10 +2,10 @@ package com.hccake.extend.dingtalk;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.hccake.extend.dingtalk.message.DingTalkMessage;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.Getter;
import lombok.SneakyThrows;
import lombok.experimental.Accessors;
@@ -19,9 +19,8 @@ import java.nio.charset.StandardCharsets;
*
* @author lingting 2020/6/10 21:25
*/
@Data
@Getter
@Accessors(chain = true)
@RequiredArgsConstructor
public class DingTalkSender {
/**
@@ -34,6 +33,21 @@ public class DingTalkSender {
*/
private String secret;
/**
* 普通消息发送请求
*/
private final HttpRequest request;
private final Mac mac;
@SneakyThrows
public DingTalkSender(String url) {
this.url = url;
request = HttpUtil.createPost(url);
mac = Mac.getInstance("HmacSHA256");
}
/**
* 发送消息 根据参数值判断使用哪种发送方式
*
@@ -55,7 +69,7 @@ public class DingTalkSender {
* @author lingting 2020-06-11 00:09:23
*/
public DingTalkResponse sendNormalMessage(DingTalkMessage message) {
return DingTalkResponse.getInstance(HttpUtil.post(url, message.generate()));
return DingTalkResponse.getInstance(request.body(message.generate()).execute().body());
}
/**
@@ -65,23 +79,32 @@ public class DingTalkSender {
*/
@SneakyThrows
public DingTalkResponse sendSecretMessage(DingTalkMessage message) {
return DingTalkResponse.getInstance(HttpUtil.post(secret(), message.generate()));
return DingTalkResponse.getInstance(
request.setUrl(secret(System.currentTimeMillis())).body(message.generate()).execute().body());
}
/**
* 设置密钥
* @author lingting 2020-09-04 14:37
*/
@SneakyThrows
public DingTalkSender setSecret(String secret) {
if (StrUtil.isNotEmpty(secret)) {
this.secret = secret;
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
}
return this;
}
/**
* 获取签名后的请求路径
*
* @param timestamp 当前时间戳
* @author lingting 2020-06-11 00:13:55
*/
@SneakyThrows
public String secret() {
long timestamp = System.currentTimeMillis();
String stringToSign = timestamp + "\n" + secret;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
String encode = URLEncoder.encode(Base64.encode(signData), "UTF-8");
return url + "&timestamp=" + timestamp + "&sign=" + encode;
public String secret(long timestamp) {
return url + "&timestamp=" + timestamp + "&sign=" + URLEncoder.encode(
Base64.encode(mac.doFinal((timestamp + "\n" + secret).getBytes(StandardCharsets.UTF_8))), "UTF-8");
}
}

View File

@@ -24,9 +24,7 @@ public class DingTalkAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DingTalkSender dingTalkSender() {
DingTalkSender sender = new DingTalkSender(dingTalkProperties.getUrl());
sender.setSecret(dingTalkProperties.getSecret());
return sender;
return new DingTalkSender(dingTalkProperties.getUrl()).setSecret(dingTalkProperties.getSecret());
}
}