@Component
@Slf4j
public class PayCacheInerceptor extends HandlerInterceptorAdapter {
private ApplicationEventPublisher publisher;
@Resource
private StringRedisTemplate mqRedisTemplate;
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String uri = request.getRequestURI();
if(uri.matches("^.*?/pay/.*?$")) {
String tenantCode = request.getHeader("PrivateTenantCode");
String uid = request.getHeader("uid");
Long no = mqRedisTemplate.boundSetOps("payCache").add(tenantCode+":"+uid);
if(no<=0){
throw new ParamsError("支付操作频繁,请稍后再试");//在预处理抛出异常,后续的拦截器不再处理,直接走全局异常处理.在请求的方法中抛出异常,
//拦截起的后处理方法会执行
}
}
return true;
}
@Override
public void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
String uri = request.getRequestURI();
if(!uri.matches("^.*?/pay/.*?$"))
return;
String tenantCode = request.getHeader("PrivateTenantCode");
String uid = request.getHeader("uid");
threadPoolTaskExecutor.execute(new InnerThread(tenantCode + ":" + uid));
}
class InnerThread implements Runnable {
private String cache;
public InnerThread(String cache) {
this.cache = cache;
}
@Override
public void run() {
clear(cache);
}
}
public void clear(String cache) {
try {
TimeUnit.MILLISECONDS.sleep(2500);
} catch (InterruptedException e) {
e.printStackTrace();
}
mqRedisTemplate.boundSetOps("payCache").remove(cache);
}
}