微信排重接口
1.接口定义 消息重复检查器 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 public interface WxMessageDuplicateChecker { /** * 判断消息是否重复 * * <p>普通消息:关于重试的消息排重,推荐使用msgid排重。 * <p>事件消息:关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。 * */ boolean isDuplicate(String messageId); }
2.实现
关键:注意多线程下只启动一次的设置方法。
启动守护线程,无限遍历
|消息id->时间戳的| 如果 当前时间戳-存入时间戳>存活时间,删除该消息Id
//一个消息ID在内存的过期时间:15秒. 15 * 1000L
private final Long timeToLive;
// 每隔多少周期检查消息ID是否过期:5秒. 5 * 1000L
private final Long clearPeriod;
// 消息id->消息时间戳的map.
private final ConcurrentHashMap<String, Long> msgId2Timestamp = new ConcurrentHashMap<>();
//后台清理线程是否已经开启.
private final AtomicBoolean backgroundProcessStarted = new AtomicBoolean(false);