<强> 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多线程无法注入的问题