異步處理返回結果(AsyncResult使用場景)

場景

從數據庫查詢信息,分批查詢,50000個查詢一次,再把每次查詢結果彙總,若是分10次查詢,正常查詢每次返List<Product>,要等前一次查詢返回結果後,才能執行下一次查詢,彙總結果,是同步執行的過程。試想若是能夠同時進行查詢,之間互不影響,每一個查詢返回結構後,直接彙總,這樣就大大節約了查詢時間。 AsyncResult做用就在這裏。java

借用舉例

AsyncResult是異步方式,異步主要用於調用的代碼須要長時間運行,才能返回結果的時候,能夠不阻塞調用者。數據庫

打個比方,同步方式就是你打電話給客服,客服無法馬上解決,客服說你等等,別掛電話,而後等了10分鐘,再告訴你。再掛電話。
此時電話費照收,而且你不能接打別人的電話。app

異步方式就是,客服說,我先查查,查到了給你回電話,而後掛斷。你幹別的事情。等了10分鐘,客服給你來電話了,告訴你結果。異步

 

代碼

1,分批查詢async

@Override
    public Integer selectListCount(StorageFeeChargePageCommand command, Integer status,String key) throws Exception {

        Example example= conditions(command,status);
        int count = tgStorageFeeChargeMapper.selectCountByExample(example);
        int rowMaxCount = 50000;
        //分批查詢
        int tempsize = (count % rowMaxCount) == 0 ? count / rowMaxCount : count / rowMaxCount + 1;

        //分頁數據對象轉換
        List<StorageFeeCharge> list =  new ArrayList<>();
        int listSize =0;
        ArrayList<Future<List<StorageFeeCharge>>> ret = new ArrayList<Future<List<StorageFeeCharge>>>();
        //分批查詢
        for (int i = 0; i < tempsize; i++) {
            int pageNum =i+1;
            Future<List<StorageFeeCharge>> asyncResult1 = storageCommonApplication.asynchronousGetSFeeCharge(pageNum,rowMaxCount,example,key);
                ret.add(asyncResult1);
        }
        int num = 0;

       //獲取返回結果
        for (Future<List<StorageFeeCharge>> result : ret){
                List<StorageFeeCharge> s =  result.get();
                listSize += s.size();
                s.clear();
        }
        return listSize;
    }

 

 

2,異步查詢ide

@Async
    public Future<List<StorageFeeCharge>> asynchronousGetSFeeCharge(int pageNum, int rowMaxCount, Example example,String key){

        //分頁數據對象轉換
        List<StorageFeeCharge> list =  new ArrayList<>();
            PageWrap<StorageFeeCharge> pageList = new PageWrap<StorageFeeCharge>();
            Page<TgStorageFeeCharge> page = PageUtil.startPage(pageNum,rowMaxCount);
            list =   storageCommonRepository.selectPageList( pageNum,  rowMaxCount,  example);
            saveRedis(list, key);
         return new AsyncResult(list);
    }
相關文章
相關標籤/搜索