• 实现线程池配置


    刚处理一个因为线程池启动线程之后,资源一直没有释放最终内存溢出的问题,把代码贴出来,这个贴出来的代码是没有问题的。也可以用作学习多线程的线程池配置以及多线程的学习。

      具体问题原因是因为:

      PooledExecutorManager.getPooledExecutor().execute();

      方法传入的参数是需要Runnable 类型的线程,但实际应用的时候 我们传递过来的 MngRuleMatch 类的写法是:

      public class MngRuleMatch  extends Thread{。。。}

          所以我们把MngRuleMatch 类重新修改为实现 Runnable 后就正常了 写法为:

      public class MngRuleMatch  implements Runnable{。。。} 

    在看该问题之前请先了解下Therad和Runnable之间的关系,推荐一个文章:

    http://www.oschina.net/question/565065_86563

    然后我们看下本次出现该问题的代码,如下:

    1:线程池配置文件:

     1 KEEP_ALIVE_TIME=300000
     2 BOUNDED_BUFFER_SIZE=50
     3 INIT_THREAD_SIZE=5
     4 MINIMUM_POOL_SIZE=5
     5 MAX_POOL_SIZE=20
     6 
     7 #服务处理线程数
     8 tmpLimitInviteTask.thredNum=5
     9 
    10 
    11 #线程池初始化参数 
    12 LIMIT_INVITE_KEEP_ALIVE_TIME=300000
    13 LIMIT_INVITE_BOUNDED_BUFFER_SIZE=50
    14 LIMIT_INVITE_INIT_THREAD_SIZE=5
    15 LIMIT_INVITE_MINIMUM_POOL_SIZE=5
    16 LIMIT_INVITE_MAX_POOL_SIZE=20
    17 
    18 #获取待处理的额度枯竭交易数
    19 LIMIT_INVITE_NUMBER=500
    20 REFUSE_LIMIT_INVITE_DAYS=15

    2: 实现对配置文件的读写获取的java实现类

     1 package XXX;
     2 
     3 
     4 import java.io.IOException;
     5 import java.io.InputStream;
     6 import java.util.Properties;
     7 
     8 import com.paic.pafa.app.lwc.core.util.DevLog;
     9 
    10 /**
    11  * 配制文件读取类 读取配制文件config.properties中的内容 注意:
    12  * config.properties一定要放在系统环境变量CLASSPATH包含的目录或jar文件中
    13 
    14  */
    15 public class Config {
    16     private static final String LOG_NAME = "Config";
    17     private  Properties properties;
    18     private Properties getConfig(){
    19         if(properties==null){
    20             properties = new Properties();
    21             InputStream in = null;
    22             try {
    23                 DevLog.debug("【config.properties】文件被打开了!");
    24                 in  = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties");
    25                 properties.load(in);
    26             } catch (Exception e) {
    27                 DevLog.debug("【config.properties】有误", e);
    28             } finally {
    29                 try {
    30                     if (in != null) {
    31                         in.close();
    32                     }
    33                     DevLog.debug("【config.properties】文件成功关闭了!");
    34                     in = null;
    35                 } catch (IOException e ) {
    36                     DevLog.debug("【config.properties】文件关闭有误", e);
    37                 }
    38             }
    39             DevLog.debug("【config.properties】文件的内容:" + properties);
    40         }
    41         return properties;
    42     }
    43 
    44     public  int getConfig(String param, int defaultValue) {
    45         
    46         String val = getConfig().getProperty(param);
    47         if (val == null) {
    48             Logger.debug(LOG_NAME, "Value of [" + param + "] not exist, use default value [" + defaultValue + "]");
    49             return defaultValue;
    50         }
    51 
    52         try {
    53             int i = Integer.parseInt(val);
    54             Logger.debug(LOG_NAME, "Value of [" + param + "] is [" + i + "]");
    55             return i;
    56         } catch (NumberFormatException e) {
    57             Logger.error(LOG_NAME, "Value of [" + param + "] is not a valid number, use default value [" + defaultValue + "]", e);
    58             return defaultValue;
    59         }
    60     }
    61 
    62     public  String getConfig(String param, String defaultValue) {
    63         String val = getConfig().getProperty(param);
    64         if (val == null) {
    65             Logger.debug(LOG_NAME, "Value of [" + param + "] not exist, use default value [" + defaultValue + "]");
    66             return defaultValue;
    67         }
    68 
    69         Logger.debug(LOG_NAME, "Value of [" + param + "] is [" + val + "]");
    70         return val;        
    71     }
    72 }

     3:数据准备业务逻辑处理类

        此类是查询数据库数据,也可以是接口返回等等。然后用一个while循环一直获取数据并从线程池拿到线程对数据处理

    package xxx;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import com.paic.btds.common.util.BizAppContextObjectNames;
    import com.paic.btds.sysServers.biz.bo.BtdsTxnMsgBO;
    import com.paic.btds.sysServers.biz.bo.BtrsMngLogHisBO;
    import com.paic.btds.sysServers.common.dto.BtdsTxnMsgDTO;
    import com.paic.btds.sysServers.common.dto.BtrsMngLogHisDTO;
    import com.paic.pafa.app.biz.service.BusinessServiceException;
    import com.paic.pafa.app.lwc.core.context.ApplicationContext;
    import com.paic.pafa.app.lwc.core.context.support.PafaCoreContexton;
    import com.paic.pafa.app.lwc.core.util.DevLog;
    import com.paic.pafa.logging2.Level;
    import com.paic.pafa.logging2.Logger;
    /**
     * 流水表的规则匹配服务的线程
     *
     */
    public class MngRuleMatchThread extends Thread {
    
        private Logger error = PafaCoreContexton.getInstance().getErrorLogger();
    
        private boolean flag = true;
    
        private ApplicationContext context;
    
        private Config config = new Config();
        
        private long sleep_time_1 ;
        private long sleep_time_2 ;
        private long sleep_time_3 ;
    
        public MngRuleMatchThread(ApplicationContext context) {
            this.context = context;
        }
    
        public boolean isFlag() {
            return flag;
        }
    
        public void setFlag(boolean flag) {
            this.flag = flag;
        }
    
        // 获取交易信息,调用规则引擎,标识交易信息
        public void run() {
            DevLog.debug("管理交易历史流水表规则匹配服务启动。。。。");
    
            /**初始化线程池*/
            PooledExecutorManager.initPoolExecutor();
            
            BtdsTxnMsgBO btdsTxnMsgBO = (BtdsTxnMsgBO)context.getBean(BizAppContextObjectNames.BTDSTXNMSG_BO);
            List btdsTxnMsgList = new ArrayList();
            Map channelMap = new HashMap();
            try {
                btdsTxnMsgList = btdsTxnMsgBO.selectBtdsTxnMsg();
            } catch (BusinessServiceException e2) {
                e2.printStackTrace();
            }
            if(btdsTxnMsgList != null && btdsTxnMsgList.size() > 0){
                for(int i = 0; i < btdsTxnMsgList.size(); i++){
                    BtdsTxnMsgDTO btdsTxnMsgDTO = (BtdsTxnMsgDTO)btdsTxnMsgList.get(i);
                    if(btdsTxnMsgDTO != null){
                        channelMap.put(btdsTxnMsgDTO.getSubTxnCode(), btdsTxnMsgDTO.getChannelFlg());
                    }
                }
            }
            
            setSleepTime();
            
            while (isFlag()) {
                String transActionId = PafaCoreContexton.getInstance()
                        .getThreadContext().getTxnID();
                InetAddress localHost = null;
                try {
                    localHost = InetAddress.getLocalHost();
                } catch (UnknownHostException e1) {
                }
                String hostAddress = localHost.getHostAddress();
                BtrsMngLogHisDTO dto = new BtrsMngLogHisDTO();
                dto.setIp(hostAddress);
                //更新管理交易历史流水表
                try {
                    updateBtrsMngLogHis(dto);
                } catch (BusinessServiceException e1) {
                    error.log(transActionId, Level.INFO, this.getClass().getName(), "updateBtrsMngLogHis()", "entering run", e1, "");
                }
                
                // 从管理交易历史流水表获取交易信息
                List btrsMngLogHisList = selectBtrsMngLogHis(dto);
                
                if(btrsMngLogHisList != null && btrsMngLogHisList.size() > 0){
                    
                    MngRuleMatchProducer mngRuleMatchProducer = new MngRuleMatchProducer(btrsMngLogHisList,context,channelMap);
                    mngRuleMatchProducer.ruleMatch();
                    
                    if(btrsMngLogHisList.size() < 200 && btrsMngLogHisList.size() >100){
                        try {
                            DevLog.info("扫描管理交易历史流水表种交易不足200条,休眠0.5秒");
                            Thread.sleep(getSleepTime1());
                        } catch (InterruptedException e) {
                        }
                    }else if(btrsMngLogHisList.size() < 100) {
                        try {
                            DevLog.info("扫描完管理交易历史流水表不足100条交易,休眠1秒");
                            Thread.sleep(getSleepTime2());
                        } catch (InterruptedException e) {
                        }
                    }
                }else{
                    try {
                        DevLog.info("管理交易历史流水表中没有数据,休眠5秒");
                        Thread.sleep(getSleepTime3());
                    } catch (InterruptedException e) {
                    }
                }
            }
    
        }
        
        public void setSleepTime(){
            this.sleep_time_1 = config.getConfig("MNG_SLEEP_TIME_1", 500);
            this.sleep_time_2 = config.getConfig("MNG_SLEEP_TIME_2", 1000);
            this.sleep_time_3 = config.getConfig("MNG_SLEEP_TIME_3", 5000);
        }
        
        public long getSleepTime1() {
            return this.sleep_time_1;
        }
        public long getSleepTime2() {
            return this.sleep_time_2;
        }
        public long getSleepTime3() {
            return this.sleep_time_3;
        }
    
        private void updateBtrsMngLogHis(BtrsMngLogHisDTO btrsMngLogHisDTO) throws BusinessServiceException {
            BtrsMngLogHisBO btrsMngLogHisBO = (BtrsMngLogHisBO)context.getBean(BizAppContextObjectNames.BTRSMNGLOGHIS_BO);
            btrsMngLogHisBO.updateBtrsMngLogHis(btrsMngLogHisDTO);
        }
    
        private List selectBtrsMngLogHis(BtrsMngLogHisDTO dto) {
            List btrsMngLogHisList = new ArrayList();
            String transActionId = PafaCoreContexton.getInstance()
                    .getThreadContext().getTxnID();
            BtrsMngLogHisBO btrsMngLogHisBO = (BtrsMngLogHisBO) context
                    .getBean(BizAppContextObjectNames.BTRSMNGLOGHIS_BO);
            try {
                btrsMngLogHisList = btrsMngLogHisBO.selectBtrsMngLogHis(dto);
            } catch (BusinessServiceException e) {
                error.log(transActionId, Level.INFO, this.getClass().getName(),
                        "selectBtrsMngLogHis()", "entering run", e, "");
            }
    
            return btrsMngLogHisList;
        }
    
    }

    4:线程池获取线程,并启动线程对数据处理

     1 package cxx;
     2 
     3 import java.util.Map;
     4 
     5 import EDU.oswego.cs.dl.util.concurrent.CountDown;
     6 
     7 import com.paic.btds.sysServers.common.dto.BtrsMngLogHisDTO;
     8 import com.paic.pafa.app.lwc.core.context.ApplicationContext;
     9 /**
    10  * 管理交易历史流水表的规则匹配服务的交易分发服务
    11  * @author EX_WEIPENG413
    12  *
    13  */
    14 public class MngRuleMatch  implements Runnable{
    15 
    16     private CountDown clock;
    17     private BtrsMngLogHisDTO btrsMngLogHisDTO ;
    18     private ApplicationContext context ;
    19     private Map channelMap;
    20     
    21     public MngRuleMatch(BtrsMngLogHisDTO btrsMngLogHisDTO ,CountDown clock ,ApplicationContext context, Map channelMap){
    22         this.btrsMngLogHisDTO = btrsMngLogHisDTO;
    23         this.clock =clock;
    24         this.context =context;
    25         this.channelMap = channelMap;
    26     }
    27     public void run(){
    28         try{
    29             BtrsMngLogHisDTO dto = btrsMngLogHisDTO;
    30 
    31             BtrsMngLogRuleMatch btrsMngLogRuleMatch=new BtrsMngLogRuleMatch(dto,context,channelMap);
    32             btrsMngLogRuleMatch.match();  
    33 
    34         }catch(Exception e){
    35             e.printStackTrace();
    36         }finally{
    37             clock.release();
    38         } 
    39     }
    40     
    41 }

    5:线程处理类

      1 package xxx;
      2 
      3 import java.lang.reflect.InvocationTargetException;
      4 import java.math.BigDecimal;
      5 import java.util.HashMap;
      6 import java.util.Map;
      7 
      8 import org.apache.commons.beanutils.BeanUtils;
      9 import org.apache.log4j.Logger;
     10 
     11 import com.paic.btds.common.util.BizAppContextObjectNames;
     12 import com.paic.btds.para.biz.bo.SysParamBO;
     13 import com.paic.btds.para.common.dto.SysParamDTO;
     14 import com.paic.btds.sysServers.common.dto.BtrsMngLogHisDTO;
     15 import com.paic.btds.sysServers.common.dto.BtrsTrsAllDTO;
     16 import com.paic.btds.sysServers.common.dto.BtrsTrsRuleDTO;
     17 import com.paic.btds.sysServers.web.util.SqlMappingName;
     18 import com.paic.paces.common.dao.ExecuteSqlDAO;
     19 import com.paic.pafa.app.biz.service.BusinessServiceException;
     20 import com.paic.pafa.app.integration.dao.PafaDAOException;
     21 import com.paic.pafa.app.lwc.core.beans.BeansException;
     22 import com.paic.pafa.app.lwc.core.context.ApplicationContext;
     23 import com.paic.pafa.app.lwc.core.util.DevLog;
     24 /**
     25  * 管理交易历史流水表的规则匹配服务的交易分发
     26  *
     27  *
     28  */
     29 public class BtrsMngLogRuleMatch {
     30 
     31     private ApplicationContext context;
     32     
     33     static Logger logger = Logger.getLogger(BtrsMngLogRuleMatch.class.getName());
     34     
     35     private ExecuteSqlDAO executeSqlDao;
     36     
     37     private Map channelMap;
     38     /**
     39      * 交易数据
     40      */
     41     private BtrsMngLogHisDTO btrsMngLogHisDTO = null;   
     42 
     43     public BtrsMngLogRuleMatch(BtrsMngLogHisDTO btrsMngLogHisDTO,ApplicationContext context, Map channelMap) {
     44         this.btrsMngLogHisDTO=btrsMngLogHisDTO;
     45         this.context=context;
     46         this.executeSqlDao=(ExecuteSqlDAO) context.getBean(BizAppContextObjectNames.EXECUTE_SQL_DAO);
     47         this.channelMap = channelMap;
     48     }
     49 
     50     public void match() {
     51         try {
     52             BtrsTrsAllDTO btrsTrsAllDTO = new BtrsTrsAllDTO();
     53             BtrsTrsRuleDTO btrsTrsRuleDTO = new BtrsTrsRuleDTO();
     54             BeanUtils.copyProperties(btrsTrsAllDTO,
     55                     btrsMngLogHisDTO);
     56             BeanUtils.copyProperties(btrsTrsRuleDTO,
     57                     btrsMngLogHisDTO);
     58             String amtTrans = btrsMngLogHisDTO.getTransAmt();
     59             if(amtTrans != null && !"".equals(amtTrans)){
     60                 btrsTrsAllDTO.setAmtTrans(new BigDecimal(amtTrans).multiply(new BigDecimal("100"))
     61                         .toString());
     62                 btrsTrsRuleDTO.setAmtTrans(new BigDecimal(amtTrans).multiply(new BigDecimal("100"))
     63                         .toString());
     64             }
     65             
     66             btrsTrsAllDTO.setPrimaryAcctNum(btrsMngLogHisDTO
     67                     .getCardNum());
     68             btrsTrsAllDTO.setSystemDate(btrsMngLogHisDTO
     69                     .getTrsSysDate());
     70             btrsTrsAllDTO.setSystemTime(btrsMngLogHisDTO
     71                     .getTrsSysTime());
     72             btrsTrsAllDTO.setSystemSsn(btrsMngLogHisDTO.getSystemNo());
     73             
     74             btrsTrsAllDTO.setTranDate(btrsTrsAllDTO.getSystemDate()+btrsTrsAllDTO.getSystemTime());
     75             
     76             btrsTrsRuleDTO.setPrimaryAcctNum(btrsMngLogHisDTO
     77                     .getCardNum());
     78             btrsTrsRuleDTO.setSystemDate(btrsMngLogHisDTO
     79                     .getTrsSysDate());
     80             btrsTrsRuleDTO.setSystemTime(btrsMngLogHisDTO
     81                     .getTrsSysTime());
     82             btrsTrsRuleDTO.setSystemSsn(btrsMngLogHisDTO.getSystemNo());
     83             
     84             btrsTrsRuleDTO.setTranDate(btrsTrsRuleDTO.getSystemDate()+btrsTrsRuleDTO.getSystemTime());
     85             
     86             
     87             //获取流水号
     88             String seqNumber = String.valueOf(executeSqlDao.queryForObject(SqlMappingName.GET_SEQ, null));
     89             btrsTrsAllDTO.setSqNumber(seqNumber);
     90             btrsTrsRuleDTO.setSqNumber(seqNumber);
     91             
     92             String subTxnCode = btrsMngLogHisDTO.getSubTxnCode();
     93             if(channelMap.containsKey(subTxnCode)){
     94                 String channelFlg = String.valueOf(channelMap.get(subTxnCode));
     95                 btrsTrsAllDTO.setChannelFlg(channelFlg);
     96                 btrsTrsRuleDTO.setChannelFlg(channelFlg);
     97             }else{
     98                 btrsTrsAllDTO.setChannelFlg("");
     99                 btrsTrsRuleDTO.setChannelFlg("");
    100             }
    101             if("2002010110".equals(subTxnCode) || "2002010140".equals(subTxnCode)){
    102                 btrsTrsAllDTO.setCurrcyCodeTrans("");
    103                 btrsTrsRuleDTO.setCurrcyCodeTrans("");
    104             }
    105             
    106 
    107             //获取交易的联机或离线的信息
    108             String messagetypeid = btrsMngLogHisDTO.getMessagetypeid();
    109             if(messagetypeid != null && !"".equals(messagetypeid)){
    110                 btrsTrsAllDTO.setMessagetypeid(messagetypeid);
    111                 btrsTrsRuleDTO.setMessagetypeid(messagetypeid);
    112             }
    113             //汇总到交易汇总表中
    114             executeSqlDao.insert(SqlMappingName.INSERT_BTRSTRSALLFROMMNG, btrsTrsAllDTO);
    115             
    116             if(channelMap.containsKey(subTxnCode)){
    117                 //抽取到交易规则表中
    118                 executeSqlDao.insert(SqlMappingName.INSERT_BTRSTRSRULEFROMMNG, btrsTrsRuleDTO);
    119                 
    120                 Map map = new HashMap();
    121                 map.put("KEY", seqNumber);
    122                 map.put("MATCH_RS", null);
    123                 map.put("ERR_MSG", null);
    124                 map.put("V_MATCH_PRIORITY", null);
    125                 map.put("NRETCDE", null);
    126                 map.put("V_MATCH_RULE_ID", null);
    127                 SysParamBO sysParamBO = (SysParamBO)context.getBean(BizAppContextObjectNames.SYSPARAM_BO);
    128                 SysParamDTO sysParamDTO = new SysParamDTO();
    129                 sysParamDTO.setParamName("engine_switch");
    130                 sysParamDTO.setSysFlag("S");
    131                 SysParamDTO dto = sysParamBO.selectSysParamByName(sysParamDTO);
    132                 if(dto != null){
    133                     String engineSwitch = dto.getParamValue();
    134                     if("true".equals(engineSwitch)){
    135                         //调用规则引擎
    136                         DevLog.debug("管理交易历史流水调用规则引擎。。。");
    137                         executeSqlDao.callProc(SqlMappingName.ANALYS_NEW_SQL_RULE, map);
    138                         String matchRS = (String)map.get("MATCH_RS");
    139                         String errMsg =(String)map.get("ERR_MSG");
    140                         BigDecimal nretCde =(BigDecimal)map.get("NRETCDE");
    141                         String vMatchRuleId = (String)map.get("V_MATCH_RULE_ID");
    142                         if (null!=matchRS && "1".equals(matchRS) && vMatchRuleId != null && !"".equals(vMatchRuleId))
    143                             DevLog.info("交易"+seqNumber+"匹配成功!");
    144                         else if(nretCde != null)
    145                             DevLog.info("交易"+seqNumber+"匹配失败!原因如下:"+nretCde.doubleValue() + errMsg);
    146                     }
    147                 }
    148             }
    149         } catch (PafaDAOException e) {
    150             logger.error(e.getMessage());
    151         } catch (BeansException e) {
    152             logger.error(e.getMessage());
    153         } catch (BusinessServiceException e) {
    154             logger.error(e.getMessage());
    155         } catch (IllegalAccessException e) {
    156             logger.error(e.getMessage());
    157         } catch (InvocationTargetException e) {
    158             logger.error(e.getMessage());
    159         } catch (Exception e){
    160             logger.error(e.getMessage());
    161         }
    162         
    163         //更新交易状态
    164         try {
    165             executeSqlDao.update(SqlMappingName.UPDATE_BTRSMNGLOGHISSTATUS, btrsMngLogHisDTO);
    166         } catch (PafaDAOException e) {
    167             logger.error(e.getMessage());
    168         }
    169             
    170     }
    171     
    172     
    173 }
  • 相关阅读:
    python shutil
    AttributeError: module 'shutil' has no attribute 'copyfileobj'
    python configparser
    JSON使用
    VRRP
    KeepAlived的介绍
    Nginx模块
    Nginx配置
    Nginx介绍
    apache相关补充
  • 原文地址:https://www.cnblogs.com/xiayahui/p/5735612.html
Copyright © 2020-2023  润新知