处理频繁拉起支付接口

@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);
    }


}

posted @ 2018-05-17 19:42  車輪の唄  阅读(14)  评论(0)    收藏  举报  来源