日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【java】Spring开发中不能使用IOC的情况

發布時間:2023/12/20 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【java】Spring开发中不能使用IOC的情况 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????? 在實際開發中,有些業務場景我們不能使用注解@Autowire、@Resource、@Inject等自動注入Bean。在多線程的環境下,我們調用Bean的方法來處理我們的業務數據,但是需要處理的數據資源都是單獨的,主要針對需要處理的數據資源屬于Bean的成員變量,例如:

@Component("withdrawKHQueryResultExecutor") public class OnlineWithdrawKHQueryResultExecutor implements Callable<String>{private ErrorTask errorTask;@Resourceprivate IOnlineWithdrawQueryService onlineWithdrawQueryService;@Resourceprivate IMerchInfoService merchInfoService;@Resourceprivate OnlineWithdrawHandler onlineWithdrawHandler;@Overridepublic String call() throws Exception {String txnId = errorTask.getTxnId();String finalSts = errorTask.getFinalStatus();BillBizSimple simple = onlineWithdrawQueryService.queryBillBizSimle(txnId);MerchInfo merchInfo = merchInfoService.selectByMerchId(simple.getMerchId());if(FilnalStatusEnum.C_FIRST_POST_FAIL.getValue().equals(finalSts)){onlineWithdrawHandler.handleFirstPostingFail(simple,merchInfo,errorTask);}return "執行成功!";}public ErrorTask getErrorTask() {return errorTask;}public void setErrorTask(ErrorTask errorTask) {this.errorTask = errorTask;}}?對于我們來說,errorTask就是需要我們傳入的資源,再來看調用的方法代碼:

@Component("withdrawKHQueryResultJob") public class WithdrawKHQueryResultJob {private static final Logger logger = Logger.getLogger(WithdrawKHQueryResultJob.class);private static final int FIXED_THREAD_POOL_NUM = 5;private static ExecutorService threadPool = Executors.newFixedThreadPool(FIXED_THREAD_POOL_NUM);private static List<String> finalStsList;@Resourceprivate IErrorTaskService errorTaskService;@Resourceprivate OnlineWithdrawKHQueryResultExecutor withdrawKHQueryResultExecutor;@Overridepublic void runJob(String batchDate) throws Exception {try{// 計算5分鐘之前的時間Date modTime = DateUtil.getTimeByMinute(-5);// 查詢條件ErrorTaskExampleExt example = new ErrorTaskExampleExt();example.createCriteria().andFinalStatusIn(finalStsList).andModifyTimeGreaterThanOrEqualTo(modTime);// 總記錄數int totalRecords = errorTaskService.countByExample(example);logger.info(getJobId()+"本次執行總記錄數:" + totalRecords);final CompletionService<String> completionService = new ExecutorCompletionService<String>(threadPool);Pager pager = new Pager(totalRecords, Constant.QUERY_DBDATE_PAGE_SIZE);if(pager.getTotal() > 0){for (int page = 1,n=pager.getPages(); page <= n; page++) {example.setStart((page-1)*pager.getPageSize());example.setLimit(pager.getPageSize());List<ZbErrorTask> handleList= errorTaskService.selectByExampleByPage(example);if (!CollectionUtils.isEmpty(handleList)) {for (int i = 0, m = handleList.size(); i < m; i++) {ZbErrorTask errorTask = handleList.get(i);withdrawKHQueryResultExecutor.setErrorTask(errorTask);Future<String> future = completionService.submit(withdrawKHQueryResultExecutor);}}}}}catch(Exception e){e.printStackTrace();}}static{finalStsList = new ArrayList<String>();finalStsList.add(FilnalStatusEnum.C_FIRST_POST_FAIL.getValue());}}
我們把withdrawKHQueryResultExecutor當做參數進行了執行,這樣多線程執行就會出問題,我們知道 spring bean 的作用域,

一般常用的有singleton、prototype看來本例中我們的bean需要使用prototype作用域來處理了。我們獲取Spring Bean的方式也需要調整下,目前利用了Spring的IOC來注入,那我們還有另外一個方式來獲取Bean,那就是我們需要自己來寫一個工具類,需要實現Spring的ApplicationContextAware接口,關于用法網上的講解很多,自行解決,下面看工具類的代碼:

public class SpringContextUtil implements ApplicationContextAware {@Autowiredprivate static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringContextUtil.context=applicationContext;}public static <T> T getBean(String name, Class<T> requiredType){return context.getBean(name, requiredType);}public static Object getBean(String name){return context.getBean(name);}public static <T> Object getBean(Class<T> requiredType){return context.getBean(requiredType);}public static ApplicationContext getContext() {return context;}public static void setContext(ApplicationContext context) {SpringContextUtil.context = context;}}
這樣我們就開始調整程序了,最終的代碼程序如下:

@Scope("prototype") @Component("withdrawKHQueryResultExecutor") public class OnlineWithdrawKHQueryResultExecutor implements Callable<String>{private ErrorTask errorTask;@Resourceprivate IOnlineWithdrawQueryService onlineWithdrawQueryService;@Resourceprivate IMerchInfoService merchInfoService;@Resourceprivate OnlineWithdrawHandler onlineWithdrawHandler;@Overridepublic String call() throws Exception {String txnId = errorTask.getTxnId();String finalSts = errorTask.getFinalStatus();BillBizSimple simple = onlineWithdrawQueryService.queryBillBizSimle(txnId);MerchInfo merchInfo = merchInfoService.selectByMerchId(simple.getMerchId());if(FilnalStatusEnum.C_FIRST_POST_FAIL.getValue().equals(finalSts)){onlineWithdrawHandler.handleFirstPostingFail(simple,merchInfo,errorOrderTask);}return "執行成功!";}public ErrorTask getErrorTask() {return errorTask;}public void setErrorTask(ErrorTask errorTask) {this.errorTask = errorTask;}}
@Component("withdrawKHQueryResultJob") public class WithdrawKHQueryResultJob {private static final Logger logger = Logger.getLogger(WithdrawKHQueryResultJob.class);private static final int FIXED_THREAD_POOL_NUM = 5;private static ExecutorService threadPool = Executors.newFixedThreadPool(FIXED_THREAD_POOL_NUM);private static List<String> finalStsList;@Resourceprivate IErrorTaskService errorTaskService;@Overridepublic void runJob(String batchDate) throws Exception {try{// 計算5分鐘之前的時間Date modTime = DateUtil.getTimeByMinute(-5);// 查詢條件ErrorTaskExampleExt example = new ErrorTaskExampleExt();example.createCriteria().andFinalStatusIn(finalStsList).andModifyTimeGreaterThanOrEqualTo(modTime);// 總記錄數int totalRecords = errorTaskService.countByExample(example);logger.info(getJobId()+"本次執行總記錄數:" + totalRecords);final CompletionService<String> completionService = new ExecutorCompletionService<String>(threadPool); Pager pager = new Pager(totalRecords, Constant.QUERY_DBDATE_PAGE_SIZE);if(pager.getTotal() > 0){for (int page = 1,n=pager.getPages(); page <= n; page++) {example.setStart((page-1)*pager.getPageSize());example.setLimit(pager.getPageSize());List<ZbErrorTask> handleList= errorTaskService.selectByExampleByPage(example);if (!CollectionUtils.isEmpty(handleList)) {for (int i = 0, m = handleList.size(); i < m; i++) {ZbErrorOrderTask errorOrderTask = handleList.get(i);OnlineWithdrawKHQueryResultExecutor withdrawKHQueryResultExecutor = (OnlineWithdrawKHQueryResultExecutor) SpringContextUtil.getBean("withdrawKHQueryResultExecutor");withdrawKHQueryResultExecutor.setErrorOrderTask(errorOrderTask);Future<String> future = completionService.submit(withdrawKHQueryResultExecutor);}}}}}catch(Exception e){e.printStackTrace();}}static{finalStsList = new ArrayList<String>();finalStsList.add(FilnalStatusEnum.C_FIRST_POST_FAIL.getValue());}}

總結

以上是生活随笔為你收集整理的【java】Spring开发中不能使用IOC的情况的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。