springboot整合ehcache 实现支付超时限制

<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache-core</artifactId>
  <version>2.6.11</version>
</dependency>

pom文件中引入ehcache依赖    

在类路径下存放ehcache.xml文件。

application.xml中指定:

spring: 
 cache:
  jcache:
   config: classpath:ehcache.xml

类标注@EnableCaching

 

实现核心代码

    /*
     * 记录用户支付的时间戳
     */
    public void pinUser(Object userKey) throws Exception{
        Cache cache = manager.getCache(cacheName);
        Element element = cache.get(userKey);
        if(element == null){
            /*如果没有找到用户的支付记录,则记录缓存,然后继续*/
            Element newE = new Element(userKey, new Date().getTime());
            cache.put(newE);
        } else {
            /*如果存在用户的支付记录,则应该抛出异常,并提示用户相应的信息*/
            long inTime = (Long) element.getObjectValue();
            long timeToWait = (getTimeToLive() - (new Date().getTime() - inTime)/1000);
            //提示需要等待的时间
            throw new Exception(String.format("还需等待%s秒",String.valueOf(timeToWait)));
        }
    }

    /*
     * 删除用户支付的时间戳(该方法用于系统内部支付失败时,手动去掉用户的支付记录,从而不影响用户再次尝试)
     * 正常时候不应该调用该方法,而是应该等缓存超时后自动清除
     */
    public void unPinUser(Object userKey) {
        Cache cache = manager.getCache(cacheName);
        cache.remove(userKey);
    }

    /*
     * 获取缓存配置,用来换算用户还需等待的时间,从而给出较为友好的等待时间提示。
     */
    private long getTimeToLive(){
        Cache cache = manager.getCache(cacheName);
        return cache.getCacheConfiguration().getTimeToLiveSeconds();
    }

  

使用

在调用支付接口的地方调用PayToken.getInstance().pinUser(user.getKey())即可,若抛出异常,即说明支付间隔时间太小,同时如果还有附加数据操作,抛出异常亦可以触发回滚操作。 
若是系统原因导致执行失败而仍需用户等待是不合理的,因此增加了解除用户记录的方法PayToken.getInstance().unPinUser(user.getKey())

posted @ 2017-07-08 01:05  zhanglin0506  阅读(823)  评论(0编辑  收藏  举报