解决SpringBoot2多线程无法注入的问题

  

<强> 1,情况描述

  

使用springboot2多线程,线程类无法实现自动注入需要的bean,解决思路,通过工具类获取需要的bean

  

如下         包com.ps.uzkefu.apps.ctilink.handler;      进口com.baomidou.mybatisplus.mapper.EntityWrapper;   进口com.ps.uzkefu.apps.callcenter.entity.CallRecord;   进口com.ps.uzkefu.apps.callcenter.service.CallRecordService;   进口com.ps.uzkefu.apps.ctilink.init.ApplicationContextProvider;   进口com.ps.uzkefu.apps.ctilink.ommodel.CallCdr;   进口com.ps.uzkefu.apps.ctilink.ommodel.Cdr;   进口com.ps.uzkefu.apps.ctilink.rediskey.CdrType;   进口com.ps.uzkefu.apps.ctilink.rediskey.EventType;   进口com.ps.uzkefu.apps.ctilink.rediskey.RedisKeyPrefix;   进口com.ps.uzkefu.apps.oms.account.entity.User;   进口com.ps.uzkefu.apps.oms.account.service.UserService;   进口com.ps.uzkefu.util.UUIDUtil;   进口com.ps.uzkefu.utils.PhoneModel;   进口com.ps.uzkefu.utils.PhoneUtils;   进口org.apache.commons.lang.StringUtils;   进口org.redisson.api.RBucket;   进口org.redisson.api.RedissonClient;      进口java.util.Date;   进口java.util.Objects;/* *   *作者:ZhuShangJin   *日期:2018/6/26   */公共类CdrHandler实现Runnable {      公共Cdr Cdr;//无法自动注入   公共RedissonClient RedissonClient;//无法自动注入   公共UserService UserService;//无法自动注入   公共CallRecordService CallRecordService;      公共CdrHandler () {//新的时候注入需要的bean   这一点。redissonClient=ApplicationContextProvider.getBean (RedissonClient.class);   这一点。userService=ApplicationContextProvider.getBean (UserService.class);   这一点。callRecordService=ApplicationContextProvider.getBean (CallRecordService.class);   }      公共RedissonClient getRedissonClient () {   返回redissonClient;   }      公共空间setRedissonClient (RedissonClient RedissonClient) {   这一点。redissonClient=redissonClient;   }      公共Cdr getCdr () {   返回cdr;   }      公共空间setCdr (Cdr Cdr) {      这一点。cdr=cdr;   }      公共UserService getUserService () {   返回userService;   }      公共空间setUserService (UserService UserService) {   这一点。userService=userService;   }      公共CallRecordService getCallRecordService () {   返回callRecordService;   }      公共空间setCallRecordService (CallRecordService CallRecordService) {   这一点。callRecordService=callRecordService;   }      @Override   公共空间run () {   如果(this.getCdr () .getOuter () !=null) {   saveOuterCdr ();   }else if (this.getCdr () .getVisitor () !=null) {   saveVistorCdr ();   }   }      私人空间saveOuterCdr () {//外呼通话结束   CallCdr CallCdr=零;   RBucket桶=redissonClient.getBucket (RedisKeyPrefix。.getId .getOuter CALL_OUTER_CDR + this.getCdr () () () +“_”+ cdr.getCpn ());   callCdr=bucket.get ();   callCdr.setRedisKey (RedisKeyPrefix。.getId .getOuter CALL_OUTER_CDR + this.getCdr () () () +“_”+ cdr.getCpn ());   callCdr.setLastEvent (EventType.BYE);   callCdr。setLastEventTime(新日期());   .getDuration callCdr.setTalkLength (Integer.parseInt (this.getCdr () ()));   .getTrunkNumber callCdr.setTrunkNum (this.getCdr () ());   callCdr。setHangupTime(新日期());   .getRecording callCdr.setRecord (this.getCdr () ());   如果(callCdr.getAnsweredTime ()==null) {   callCdr.setCallTime (callCdr.getHangupTime ());   其他}{   长时间=callCdr.getAnsweredTime () .getTime ()——callCdr.getRingLength () * 1000;   callCdr。setCallTime(新日期(时间));   }//todo保存到数据库   用户用户=userService。selectOne(新EntityWrapper ()。eq(“扩展”,callCdr.getExtensionNum () + " "));   callCdr.setUserName (user.getUserName ());   callCdr.setCorpCode (user.getCorpCode ());   callCdr.setCreater (user.getId ());   callCdr.setId (UUIDUtil.genUUID ());   callCdr。setCreateTime(新日期());   PhoneModel PhoneModel=PhoneUtils.getPhoneModel (callCdr.getCustomerPhone ());   如果(phoneModel !=null) {   callCdr.setCustomerCity (phoneModel.getCityName ());   callCdr.setCustomerProvince (phoneModel.getProvinceName ());   }   callCdr.setCallId (System.currentTimeMillis () + " " + callCdr.getCallId ());   bucket.set (callCdr);   CallRecord CallRecord=callCdr;   布尔结果=callRecordService.insert (callRecord);   如果(结果){   bucket.delete ();   }   }      私人空间saveVistorCdr () {   CallCdr CallCdr=零;   RBucket

解决SpringBoot2多线程无法注入的问题