mirror of
https://github.com/zongzibinbin/MallChat.git
synced 2026-03-13 21:53:41 +08:00
fix:微信推送接入频控
This commit is contained in:
@@ -88,6 +88,17 @@ public abstract class AbstractFrequencyControlService<K extends FrequencyControl
|
||||
T get() throws Throwable;
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface Executor {
|
||||
|
||||
/**
|
||||
* Gets a result.
|
||||
*
|
||||
* @return a result
|
||||
*/
|
||||
void execute() throws Throwable;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否达到限流阈值 子类实现 每个子类都可以自定义自己的限流逻辑判断
|
||||
*
|
||||
|
||||
@@ -28,6 +28,14 @@ public class FrequencyControlUtil {
|
||||
return frequencyController.executeWithFrequencyControl(frequencyControl, supplier);
|
||||
}
|
||||
|
||||
public static <K extends FrequencyControlDTO> void executeWithFrequencyControl(String strategyName, K frequencyControl, AbstractFrequencyControlService.Executor executor) throws Throwable {
|
||||
AbstractFrequencyControlService<K> frequencyController = FrequencyControlStrategyFactory.getFrequencyControllerByName(strategyName);
|
||||
frequencyController.executeWithFrequencyControl(frequencyControl, () -> {
|
||||
executor.execute();
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 多限流策略的编程式调用方法调用方法
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
package com.abin.mallchat.custom.chat.service.impl;
|
||||
|
||||
import cn.hutool.core.thread.NamedThreadFactory;
|
||||
import com.abin.mallchat.common.common.domain.dto.FrequencyControlDTO;
|
||||
import com.abin.mallchat.common.common.exception.FrequencyControlException;
|
||||
import com.abin.mallchat.common.common.handler.GlobalUncaughtExceptionHandler;
|
||||
import com.abin.mallchat.common.common.service.frequencycontrol.FrequencyControlUtil;
|
||||
import com.abin.mallchat.common.common.utils.JsonUtils;
|
||||
import com.abin.mallchat.common.user.domain.entity.User;
|
||||
import com.abin.mallchat.common.user.service.cache.UserCache;
|
||||
@@ -15,20 +18,17 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static com.abin.mallchat.common.common.service.frequencycontrol.FrequencyControlStrategyFactory.TOTAL_COUNT_WITH_IN_FIX_TIME_FREQUENCY_CONTROLLER;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
public class WeChatMsgOperationServiceImpl implements WeChatMsgOperationService {
|
||||
public class WeChatMsgOperationServiceImpl implements WeChatMsgOperationService {
|
||||
|
||||
private static final ExecutorService executor = new ThreadPoolExecutor(1, 10, 3000L,
|
||||
TimeUnit.MILLISECONDS,
|
||||
@@ -54,15 +54,31 @@ public class WeChatMsgOperationServiceImpl implements WeChatMsgOperationService
|
||||
uidSet.addAll(receiverUidList);
|
||||
Map<Long, User> userMap = userCache.getUserInfoBatch(uidSet);
|
||||
userMap.values().forEach(user -> {
|
||||
if (Objects.nonNull(user.getOpenId()) && user.isPublishChatToWechatSwitch()) {
|
||||
if (Objects.nonNull(user.getOpenId())) {
|
||||
executor.execute(() -> {
|
||||
WxMpTemplateMessage msgTemplate = getAtMsgTemplate(sender, user.getOpenId(), msg);
|
||||
publishTemplateMsg(msgTemplate);
|
||||
publishTemplateMsgCheckLimit(msgTemplate);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void publishTemplateMsgCheckLimit(WxMpTemplateMessage msgTemplate) {
|
||||
try {
|
||||
FrequencyControlDTO frequencyControlDTO = new FrequencyControlDTO();
|
||||
frequencyControlDTO.setKey("TemplateMsg:" + msgTemplate.getToUser());
|
||||
frequencyControlDTO.setUnit(TimeUnit.HOURS);
|
||||
frequencyControlDTO.setCount(1);
|
||||
frequencyControlDTO.setTime(1);
|
||||
FrequencyControlUtil.executeWithFrequencyControl(TOTAL_COUNT_WITH_IN_FIX_TIME_FREQUENCY_CONTROLLER, frequencyControlDTO,
|
||||
() -> publishTemplateMsg(msgTemplate));
|
||||
} catch (FrequencyControlException e) {
|
||||
log.info("wx push limit openid:{}", msgTemplate.getToUser());
|
||||
} catch (Throwable e) {
|
||||
log.error("wx push error openid:{}", msgTemplate.getToUser());
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 构造微信模板消息
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user