最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決SpringBoot2多線程無法注入的問題

 更新時間:2020年08月26日 14:41:53   作者:NemoHero  
這篇文章主要介紹了解決SpringBoot2多線程無法注入的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

1、情況描述

使用springboot2多線程,線程類無法實現(xiàn)自動注入需要的bean,解決思路,通過工具類獲取需要的bean

如下

package com.ps.uzkefu.apps.ctilink.handler;
 
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.ps.uzkefu.apps.callcenter.entity.CallRecord;
import com.ps.uzkefu.apps.callcenter.service.CallRecordService;
import com.ps.uzkefu.apps.ctilink.init.ApplicationContextProvider;
import com.ps.uzkefu.apps.ctilink.ommodel.CallCdr;
import com.ps.uzkefu.apps.ctilink.ommodel.Cdr;
import com.ps.uzkefu.apps.ctilink.rediskey.CdrType;
import com.ps.uzkefu.apps.ctilink.rediskey.EventType;
import com.ps.uzkefu.apps.ctilink.rediskey.RedisKeyPrefix;
import com.ps.uzkefu.apps.oms.account.entity.User;
import com.ps.uzkefu.apps.oms.account.service.UserService;
import com.ps.uzkefu.util.UUIDUtil;
import com.ps.uzkefu.utils.PhoneModel;
import com.ps.uzkefu.utils.PhoneUtils;
import org.apache.commons.lang.StringUtils;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
 
import java.util.Date;
import java.util.Objects;
 
/**
 * Author:ZhuShangJin
 * Date:2018/6/26
 */
public class CdrHandler implements Runnable {
 
 public Cdr cdr;
 //無法自動注入
 public RedissonClient redissonClient;
 //無法自動注入
 public UserService userService;
 //無法自動注入
 public CallRecordService callRecordService;
 
 public CdrHandler() {
  //new的時候注入需要的bean
  this.redissonClient = ApplicationContextProvider.getBean(RedissonClient.class);
  this.userService = ApplicationContextProvider.getBean(UserService.class);
  this.callRecordService = ApplicationContextProvider.getBean(CallRecordService.class);
 }
 
 public RedissonClient getRedissonClient() {
  return redissonClient;
 }
 
 public void setRedissonClient(RedissonClient redissonClient) {
  this.redissonClient = redissonClient;
 }
 
 public Cdr getCdr() {
  return cdr;
 }
 
 public void setCdr(Cdr cdr) {
 
  this.cdr = cdr;
 }
 
 public UserService getUserService() {
  return userService;
 }
 
 public void setUserService(UserService userService) {
  this.userService = userService;
 }
 
 public CallRecordService getCallRecordService() {
  return callRecordService;
 }
 
 public void setCallRecordService(CallRecordService callRecordService) {
  this.callRecordService = callRecordService;
 }
 
 @Override
 public void run() {
  if (this.getCdr().getOuter() != null) {
   saveOuterCdr();
  } else if (this.getCdr().getVisitor() != null) {
   saveVistorCdr();
  }
 }
 
 private void saveOuterCdr() {
  // 外呼 通話結(jié)束
  CallCdr callCdr = null;
  RBucket<CallCdr> bucket = redissonClient.getBucket(RedisKeyPrefix.CALL_OUTER_CDR + this.getCdr().getOuter().getId() + "_" + cdr.getCpn());
  callCdr = bucket.get();
  callCdr.setRedisKey(RedisKeyPrefix.CALL_OUTER_CDR + this.getCdr().getOuter().getId() + "_" + cdr.getCpn());
  callCdr.setLastEvent(EventType.BYE);
  callCdr.setLastEventTime(new Date());
  callCdr.setTalkLength(Integer.parseInt(this.getCdr().getDuration()));
  callCdr.setTrunkNum(this.getCdr().getTrunkNumber());
  callCdr.setHangupTime(new Date());
  callCdr.setRecord(this.getCdr().getRecording());
  if (callCdr.getAnsweredTime() == null){
   callCdr.setCallTime(callCdr.getHangupTime());
  }else {
   long time = callCdr.getAnsweredTime().getTime() - callCdr.getRingLength()*1000;
   callCdr.setCallTime(new Date(time));
  }
  //todo 保存到數(shù)據(jù)庫
  User user = userService.selectOne(new EntityWrapper<User>().eq("extension", callCdr.getExtensionNum() + ""));
  callCdr.setUserName(user.getUserName());
  callCdr.setCorpCode(user.getCorpCode());
  callCdr.setCreater(user.getId());
  callCdr.setId(UUIDUtil.genUUID());
  callCdr.setCreateTime(new Date());
  PhoneModel phoneModel = PhoneUtils.getPhoneModel(callCdr.getCustomerPhone());
  if (phoneModel != null) {
   callCdr.setCustomerCity(phoneModel.getCityName());
   callCdr.setCustomerProvince(phoneModel.getProvinceName());
  }
  callCdr.setCallId(System.currentTimeMillis() + "" + callCdr.getCallId());
  bucket.set(callCdr);
  CallRecord callRecord = callCdr;
  boolean result = callRecordService.insert(callRecord);
  if (result) {
   bucket.delete();
  } 
 } 

 private void saveVistorCdr() {
  CallCdr callCdr = null;
  RBucket<CallCdr> bucket = redissonClient.getBucket(RedisKeyPrefix.CALL_VISITOR_CDR + this.getCdr().getVisitor().getId() + "_" + cdr.getTrunkNumber());
  callCdr = bucket.get();
  callCdr.setRedisKey(RedisKeyPrefix.CALL_VISITOR_CDR + this.getCdr().getVisitor().getId() + "_" + cdr.getTrunkNumber());
  callCdr.setRecord(this.getCdr().getRecording());
  PhoneModel phoneModel = PhoneUtils.getPhoneModel(callCdr.getCustomerPhone());
  if (phoneModel != null) {
   callCdr.setCustomerCity(phoneModel.getCityName());
   callCdr.setCustomerProvince(phoneModel.getProvinceName());
  }
  callCdr.setCallId(System.currentTimeMillis() + "" + callCdr.getCallId());
  callCdr.setId(UUIDUtil.genUUID());
  //來電 通話結(jié)束 外部電話 呼入 接入分機的童虎記錄
  if (Objects.equals(CdrType.IN, this.getCdr().getType()) && this.getCdr().getCdpn().length() == 5) {
   callCdr.setExtensionNum(Integer.parseInt(this.getCdr().getCdpn()));
   User user = userService.selectOne(new EntityWrapper<User>().eq("extension", callCdr.getExtensionNum() + ""));
   callCdr.setUserName(user.getUserName());
   callCdr.setCorpCode(user.getCorpCode());
   callCdr.setCreater(user.getId());
   if (Objects.equals(EventType.RING, callCdr.getLastEvent())) {
    if (StringUtils.isBlank(this.getCdr().getRecording())) {
     //用戶在坐席未接來電時 未接來電無錄音 掛機
     int ringLength = (int) ((new Date().getTime() - callCdr.getLastEventTime().getTime()) / 1000);
     callCdr.setRingLength(ringLength);
     callCdr.setTalkLength(0);
    } else {
     //特殊情況 坐席接聽后立馬掛掉
     callCdr.setTalkLength(Integer.parseInt(this.getCdr().getDuration()));
     callCdr.setRingLength(-1);
     callCdr.setLastEvent(CdrType.UNUSUAL);
    }
   } else {
    //正常情況
    callCdr.setTalkLength(Integer.parseInt(this.getCdr().getDuration()));
   }
  } else if (Objects.equals(CdrType.IN, this.getCdr().getType()) && this.getCdr().getCdpn().length() != 5) {
   //客服沒接到
   callCdr.setExtensionNum(0);
   callCdr.setUserName("未接到");
   callCdr.setCorpCode(this.getCdr().getCdpn());
   callCdr.setCreater("未接到");
   callCdr.setTalkLength(0);
   int ringLength = (int) ((new Date().getTime() - callCdr.getCallTime().getTime())/1000);
   callCdr.setRingLength(ringLength);
  }
  callCdr.setCreateTime(new Date());
  callCdr.setHangupTime(new Date());
  bucket.set(callCdr);
 
  if (Objects.equals(CdrType.IN, this.getCdr().getType())
    && this.getCdr().getCdpn().length() == 5
    && Objects.equals(EventType.RING, callCdr.getLastEvent())
    && StringUtils.isNotBlank(this.cdr.getRecording())) {
 
  }else if(Objects.equals(CdrType.UNUSUAL,callCdr.getLastEvent())){
 
  }else {
   CallRecord callRecord = callCdr;
   boolean result = callRecordService.insert(callRecord);
   if (result) {
    bucket.delete();
   }
  }
 }
}

2、獲取bean的工具類

package com.ps.uzkefu.apps.ctilink.init;
 
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
 
/**
 * Author:ZhuShangJin
 * Date:2018/7/3
 */
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
 /**
  * 上下文對象實例
  */
 private static ApplicationContext applicationContext;
 
 @Override
 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  this.applicationContext = applicationContext;
 }
 
 /**
  * 獲取applicationContext
  *
  * @return
  */
 public static ApplicationContext getApplicationContext() {
  return applicationContext;
 }
 
 /**
  * 通過name獲取 Bean.
  *
  * @param name
  * @return
  */
 public static Object getBean(String name) {
  return getApplicationContext().getBean(name);
 }
 
 /**
  * 通過class獲取Bean.
  *
  * @param clazz
  * @param <T>
  * @return
  */
 public static <T> T getBean(Class<T> clazz) {
  return getApplicationContext().getBean(clazz);
 }
 
 /**
  * 通過name,以及Clazz返回指定的Bean
  *
  * @param name
  * @param clazz
  * @param <T>
  * @return
  */
 public static <T> T getBean(String name, Class<T> clazz) {
  return getApplicationContext().getBean(name, clazz);
 }
}

3、通過工具類的getBean方法即可獲取bean

補充知識:關(guān)于Spring/SpringBoot在靜態(tài)工具類中注入Service的解決方案

前言今天博主將為大家分享:關(guān)于Spring/SpringBoot在靜態(tài)工具類中注入Service的解決方案!不喜勿噴,如有異議歡迎討論!

最近遇到了需要在工具類中注入Service,由于工具類中方法一般都是靜態(tài)的,所以要求該屬性也要是靜態(tài)的(Service)。但是由于Spring/SpringBoot正常情況下不能支持注入靜態(tài)屬性(會報空指針異常)。主要原因在于:Spring的依賴注入實際上是依賴于Set方法進行注入值的,Spring是基于對象層面的依賴注入,而靜態(tài)屬性/靜態(tài)變量實際上是屬于類的。

解決方案:

給當(dāng)前的工具類加上@Component,使其成為一個bean對象

聲明一個靜態(tài)的屬性(加上注解@Autowired),一個非靜態(tài)的屬性。

聲明一個返回值為void并且不能拋出異常的方法,在其中將非靜態(tài)屬性賦值給靜態(tài)屬性。該方法上加上注解@PostConstruct

這樣就將service的值注入了進來。示例代碼如下:

/**
*
*@Description: 關(guān)于Spring/SpringBoot在靜態(tài)工具類中注入Service的解決方案
*@ClassName: XXUtils.java
*@author ChenYongJia
*@Date 2019年6月26日 晚上21:20
*@Email chen87647213@163.com
*/

@Component
public class XXUtils {

@Autowired
private SpecialLogSevice sevice; 

private static SpecialLogSevice specialLogSevice; 

@PostConstruct 
public void init() {
 specialLogSevice = sevice;
} 

//下面的內(nèi)容就省略了,需要調(diào)用specialLogSevice打點就行了

}

在上述代碼中@PostConstruct是Java EE5規(guī)范之后,Servlet新增的兩個影響servlet聲明周期的注解之一,另外一個是@PreConstruct。這兩個都可以用來修飾一個非靜態(tài)的返回值為void的方法,并且該方法不能拋出異常。

被@PostConstruct注解修飾的方法會在服務(wù)器加載Servlet的時候運行,并且只會被服務(wù)器調(diào)用一次,類似于Servlet中的init方法。被該注解修飾的方法會在構(gòu)造器執(zhí)行之后,init方法執(zhí)行之前執(zhí)行。Spring中允許開發(fā)者在受理的Bean中去使用它,當(dāng)IOC容器被實例化管理當(dāng)前bean時,被該注解修飾的方法會執(zhí)行,完成一些初始化的工作。

被PreConstruct注解修飾的方法會在服務(wù)器卸載Servlet的時候運行,類似于Servlet中的destroy方法。被該注解修飾的方法會在destroy方法執(zhí)行之后,Servlet徹底卸載之前執(zhí)行。

到這里:關(guān)于Spring/SpringBoot在靜態(tài)工具類中注入Service的解決方案!分享完畢了,快去試試吧!希望大家多多支持腳本之家!

相關(guān)文章

  • 深入學(xué)習(xí)Java 動態(tài)代理

    深入學(xué)習(xí)Java 動態(tài)代理

    Java 動態(tài)代理機制的出現(xiàn),使得 Java 開發(fā)人員不用手工編寫代理類,只要簡單地指定一組接口及委托類對象,便能動態(tài)地獲得代理類。下面小編和大家來一起學(xué)習(xí)一下吧
    2019-05-05
  • 使用Java和ffmpeg把音頻和視頻合成視頻的操作方法

    使用Java和ffmpeg把音頻和視頻合成視頻的操作方法

    這篇文章主要介紹了使用Java和ffmpeg把音頻和視頻合成視頻,本文通過實例代碼給大家介紹的非常詳細,對大家的工作或?qū)W習(xí)具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot配置攔截器實現(xiàn)過程詳解

    SpringBoot配置攔截器實現(xiàn)過程詳解

    在系統(tǒng)中經(jīng)常需要在處理用戶請求之前和之后執(zhí)行一些行為,例如檢測用戶的權(quán)限,或者將請求的信息記錄到日志中,即平時所說的"權(quán)限檢測"及"日志記錄",下面這篇文章主要給大家介紹了關(guān)于在SpringBoot項目中整合攔截器的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Java開發(fā)Oracle數(shù)據(jù)庫連接JDBC Thin Driver 的三種方法

    Java開發(fā)Oracle數(shù)據(jù)庫連接JDBC Thin Driver 的三種方法

    這篇文章主要介紹了Java開發(fā)Oracle數(shù)據(jù)庫連接JDBC Thin Driver 的三種方法,需要的朋友可以參考下
    2015-12-12
  • Java動態(tài)代理分析及簡單實例

    Java動態(tài)代理分析及簡單實例

    這篇文章主要介紹了 Java動態(tài)代理分析及簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 每天學(xué)Java!一分鐘了解JRE與JDK

    每天學(xué)Java!一分鐘了解JRE與JDK

    每天學(xué)Java!一分鐘了解JRE與JDK,什么是JRE?什么是JDK?什么是JVM?相信通過本文大家都會有所了解,感興趣的小伙伴們可以參考一下
    2016-07-07
  • springboot 設(shè)置server.port不生效的原因及解決

    springboot 設(shè)置server.port不生效的原因及解決

    這篇文章主要介紹了springboot 設(shè)置server.port不生效的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • JavaWeb使用POI操作Excel文件實例

    JavaWeb使用POI操作Excel文件實例

    這篇文章主要介紹了JavaWeb使用POI操作Excel文件,需要的朋友可以參考下
    2017-04-04
  • java實現(xiàn)打磚塊小游戲

    java實現(xiàn)打磚塊小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)打磚塊小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • springboot如何開啟和關(guān)閉kafka消費

    springboot如何開啟和關(guān)閉kafka消費

    在Kafka消費者中,通過關(guān)閉自動消費配置,使用自定義容器工廠,并在消費監(jiān)聽器上設(shè)置id,可以手動控制消費的開啟和關(guān)閉,這是根據(jù)個人經(jīng)驗總結(jié)的方法,旨在幫助其他開發(fā)者
    2024-12-12

最新評論

沙田区| 赫章县| 临颍县| 麻栗坡县| 石河子市| 内乡县| 东兴市| 崇州市| 山阴县| 玉环县| 安庆市| 定结县| 乌兰浩特市| 泾源县| 佛学| 永寿县| 苏尼特右旗| 萨嘎县| 罗定市| 合山市| 万全县| 靖安县| 崇文区| 长沙县| 咸丰县| 榆林市| 山阳县| 河间市| 龙川县| 海伦市| 梅河口市| 宜昌市| 永安市| 沅江市| 任丘市| 德江县| 同心县| 县级市| 罗定市| 武义县| 抚远县|