代码
package com.tbc.demo.catalog.dingding;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.google.common.util.concurrent.RateLimiter;
import com.tbc.demo.utils.HttpClientUtils;
import jdk.nashorn.internal.ir.debug.ObjectSizeCalculator;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
public class DingDingMessageUtils {
private static final Logger log = LoggerFactory.getLogger(DingDingMessageUtils.class);
private static final double SPEED_LIMIT = 0.32;
private static final int SIZE_LIMIT = 1990;
private String url;
private String secret;
private Boolean execute;
private List<String> errorList = new ArrayList<>();
private static Queue<String> taskQueue = new LinkedBlockingQueue();
public static void addTask(String message) {
if (!taskQueue.contains(message)) {
taskQueue.add(message);
}
}
public DingDingMessageUtils(String url, String secret) {
this.url = url;
this.secret = secret;
}
public JSONObject sendMessage(String content) throws Exception {
return sendMessage(content, Arrays.asList(), false);
}
public JSONObject sendMessage(String content, List<String> atList, boolean isAtAll) throws Exception {
Long timestamp = System.currentTimeMillis();
String stringToSign = timestamp + "\n" + this.secret;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
String url = this.url + "×tamp=" + timestamp + "&sign=" + sign;
try {
content += timestamp;
String reqStr = buildReqStr(content, isAtAll, atList);
return HttpClientUtils.httpPost(url, reqStr);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private String buildReqStr(String content, boolean isAtAll, List<String> mobileList) {
Map<String, String> contentMap = Maps.newHashMap();
contentMap.put("content", content);
Map<String, Object> atMap = Maps.newHashMap();
atMap.put("isAtAll", isAtAll);
atMap.put("atMobiles", mobileList);
Map<String, Object> reqMap = Maps.newHashMap();
reqMap.put("msgtype", "text");
reqMap.put("text", contentMap);
reqMap.put("at", atMap);
return JSON.toJSONString(reqMap);
}
public List<String> limitSend(Queue<String> queue) throws Exception {
RateLimiter rateLimiter = RateLimiter.create(SPEED_LIMIT);
for (String s : queue) {
rateLimiter.acquire();
try {
sendMessage(queue.poll());
} catch (Exception e) {
errorList.add(s);
log.error("{}", e);
}
}
for (String s : errorList) {
rateLimiter.acquire();
try {
sendMessage(s);
} catch (Exception e) {
errorList.add(s);
log.error("redo error{}", e);
throw e;
}
}
return new ArrayList<>();
}
public void startQueueTask() throws Exception {
while (execute) {
limitSend(taskQueue);
wait(2000);
}
}
public void stopQueueTask() {
this.execute = false;
}
public static Boolean sizeOutOf(Object obj) {
return ObjectSizeCalculator.getObjectSize(obj) < SIZE_LIMIT;
}
public static List<String> subTask(List<String> strList) {
while (true) {
List<String> tempList = new ArrayList<>();
Boolean flag = true;
for (String s : strList) {
if (!sizeOutOf(s)) {
flag = false;
String substring1 = s.substring(0, s.length() / 2);
String substring2 = s.substring(s.length() / 2, s.length() - 1);
tempList.add(substring1);
tempList.add(substring2);
} else {
tempList.add(s);
}
strList = tempList;
}
if (flag) {
break;
}
}
return strList;
}
public static void main(String[] args) throws Exception {
DingDingMessageUtils dingDingMessageUtils = new DingDingMessageUtils("url", "secret");
dingDingMessageUtils.sendMessage("xxx");
dingDingMessageUtils.sendMessage("tset", Arrays.asList("13333333333", "1333333334"), false);
DingDingMessageUtils.addTask("需要发送的消息");
DingDingMessageUtils.addTask("需要发送的消息1");
DingDingMessageUtils.addTask("需要发送的消息2");
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(() -> {
try {
dingDingMessageUtils.startQueueTask();
} catch (Exception e) {
}
});
dingDingMessageUtils.stopQueueTask();
}
}
依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dingtalk</artifactId>
<version>1.4.72</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>