zoukankan      html  css  js  c++  java
  • Java的Spring内实现的mini版内存"计数器"功能

    工期紧急,不让用Redis,自己实现了一个Spring内的mini版内存"计数器"功能,很简陋,和业务耦合太紧密,需要改进。

        public Long getCreationCounter() {
            String attributeNameCreationCounter = "CreationCounter";
            Long attributeValueCreationCounter = 0L;
            boolean containsCreationCounter = false;
            
            String attributeNameExpirationDateTime = "ExpirationDateTime";
            Long attributeValueExpirationDateTime = 0L;
            boolean containsExpirationDateTime = false;
    
            Enumeration<String> attributeNames = ContextUtil.servletContext.getAttributeNames();
            while(attributeNames.hasMoreElements())  
            {  
                String name = attributeNames.nextElement();
                if(!containsCreationCounter && name.equals(attributeNameCreationCounter)){
                    containsCreationCounter = true;
                }
                if(!containsExpirationDateTime && name.equals(attributeNameExpirationDateTime)){
                    containsExpirationDateTime = true;
                }
                if(containsCreationCounter && containsExpirationDateTime){
                    break;
                }
            }
    
            boolean isExpired = false;
            if(containsExpirationDateTime){//包含超期时间
                Object attributeValueExpirationDateTimeObj = ContextUtil.servletContext.getAttribute(attributeNameExpirationDateTime);
                if(attributeValueExpirationDateTimeObj == null || attributeValueExpirationDateTimeObj.equals("")){//超期时间为空
                    isExpired = true;
                } else{//超期时间非空
                    attributeValueExpirationDateTime = (Long)ContextUtil.servletContext.getAttribute(attributeNameExpirationDateTime);
                    Long nowDateTime = (new Date()).getTime();
                    if(nowDateTime < attributeValueExpirationDateTime ){//当前时间小于超期时间,未超期
                        isExpired = false;
                    }else{//已超期
                        isExpired = true;
                    }
                }
            }else{//不含超期时间
                isExpired = true;
            }
            
            if (isExpired) {//已超期
                attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter);
                getExpirationDateTimeNew(attributeNameExpirationDateTime);
            } else {//未超期
                if(containsCreationCounter){//包含计数器
                    Object attributeValueCreationCounterObj = ContextUtil.servletContext.getAttribute(attributeNameCreationCounter);
                    if(attributeValueCreationCounterObj == null || attributeValueCreationCounterObj.equals("")){//计数器为空
                        attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter);
                    } else{//计数器非空
                        attributeValueCreationCounter = (Long)ContextUtil.servletContext.getAttribute(attributeNameCreationCounter);
                    }
                } else {//不含计数器
                    attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter);
                }
            }
    
            return attributeValueCreationCounter;
        }
    
        //生成新的超期时间,并存入上下文。
        private void getExpirationDateTimeNew(String attributeNameExpirationDateTime) {
            Long attributeValueExpirationDateTime = 0L;
            Date date= new Date();
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.DAY_OF_MONTH, 1);//增加1天
            attributeValueExpirationDateTime= calendar.getTime().getTime();
            ContextUtil.servletContext.setAttribute(attributeNameExpirationDateTime, attributeValueExpirationDateTime);
        }
        
        //从数据库查询存证量计数器,并存入上下文。
        private Long getCreationCounter(String attributeNameCreationCounter) {
            Long attributeValueCreationCounter;
            attributeValueCreationCounter = 0L;
            //从数据库读取数据到存证量计数器
            Long creationCounter = ((CreationMapper)storageMapper).getCreationCounter();
            attributeValueCreationCounter = attributeValueCreationCounter + creationCounter;
            ContextUtil.servletContext.setAttribute(attributeNameCreationCounter, attributeValueCreationCounter);
            return attributeValueCreationCounter;
        }
  • 相关阅读:
    有道翻译js解密(1)
    Python面试题之Python正则表达式re模块
    go语言从例子开始之Example4.常量
    go语言从例子开始之Example3.变量
    go语言从例子开始之Example2.类型
    go语言从例子开始之Example1.helloworld
    python模块打补丁
    gevent协程之猴子补丁带来的坑
    charles抓包小程序
    httptesting HTTP(s)接口自动化测试框架
  • 原文地址:https://www.cnblogs.com/rgqancy/p/5884305.html
Copyright © 2011-2022 走看看