🔴大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂
前言
场景:用户发给机器人消息之后,让机器人依次将消息转发给所配置上的好友或者群聊上。
需求是这样的,每次发消息的时候,不能给选中的群聊或者好友一下子都发完,我们得增加个延时。而且这个延时是有要求的:
-
多线程异步执行:避免线程堵塞
-
每个人都需要延迟,而不是说延迟这个消息的操作(比如配置了5个人,那么就是第一个人是5秒后执行,第二个是10秒后执行,第三个是15秒后执行…)
基于上面的这两个问题,所以我琢磨出来了下面的方法。
代码实现
实现方法:
/**
* 发送文本消息转发消息
*/
public void scheduleDelayedTaskZfMsg(int delay, String msg, String[] toWxids) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
for (int i = 0; i < toWxids.length; i++) {
final int index = i;
final int taskDelay = delay * i;
scheduler.schedule(() -> {
try {
String wxid = toWxids[index];
log.info("延迟执行时间:{},信息:{},wxid:{}", Instant.now(), msg, wxid);
// 这里可以放置发送消息后的后续操作,例如记录日志等
WeChatVoV37 weChatVo = new WeChatVoV37();
WeChatUtils weChatUtils = new WeChatUtils();
MqttMsgControl msgControl = new MqttMsgControl();
weChatVo.setUserName(wxid);
weChatVo.setIsUnicodeEscape(0);
weChatVo.setContent(msg);
//调用发送的方法
msgControl.sendMsgV37(weChatVo, weChatUtils);
} catch (Exception e) {
log.error("发送消息失败", e);
}
}, taskDelay, TimeUnit.SECONDS);
}
// 关闭 scheduler,如果需要的话,可以在程序结束时关闭
scheduler.shutdown();
}
调用方法:
@GetMapping("testTime")
public String testTime() {
//构建一个字符串数组
String [] toWxids = new String[4];
toWxids[0] = "aa";
toWxids[1] = "bb";
toWxids[2] = "cc";
toWxids[3] = "dd";
delayedTaskService.scheduleDelayedTaskZfMsg(3,"1111",toWxids);
return "success";
}
我这边设置的是每隔3秒执行一次。
真是环境下的调用方法:
/**
* 私聊转发消息
* @param fromWxid 发送的人
* @param msg 发送的消息
*/
private void siLiaoZhuanFa(String fromWxid,String msg) {
if (!msg.contains("转发:")) {
//不转发
return;
}
//查看私聊转发的状态
String siliaozhuanfaStatus = fileUtiils.readIni(Contant.INI_FILE, "siliaozhuanfa", "status");
if (!siliaozhuanfaStatus.equals("yes")) {
//未开启
return;
}
msg = msg.replace("转发:", "");
//需要转发
//获取发送人是不是配置的里面的
String admins = fileUtiils.readIni(Contant.INI_FILE, "siliaozhuanfa", "admins");
if (admins.contains(fromWxid)) {
//需要转发,获取需要转发的群或者好友
String toWxids = fileUtiils.readIni(Contant.INI_FILE, "siliaozhuanfa", "toWxid");
//获取延迟的时间
int yanchi = Integer.parseInt(fileUtiils.readIni(Contant.INI_FILE, "siliaozhuanfa", "yanchi"));
String[] toWxid = toWxids.split(",");
//将消息延迟转发
delayedTaskService.scheduleDelayedTaskZfMsg(yanchi, msg, toWxid);
} else {
log.error("当前发送人:{},没有在配置的里面,不转发", fromWxid);
}
}
##green##
🟢
至此,此文over。