본문 바로가기
Java

Java8 비동기 처리 예제

by 루에 2024. 9. 13.
반응형
public List<YcvsSsevntInfo> retrieveYcvsSsevntList(String svcTypeCd, String strCd, String custNo, String sessnId) {

        // 기획전 목록 조회
        List<YcvsSsevntInfo> sseventList = this.ycvsSseventGsmcMapper.retrieveYcvsSsevntList(svcTypeCd, strCd, custNo, sessnId);

        if (sseventList == null || sseventList.isEmpty()) {
            return null;
        }

        List<CompletableFuture<Void>> asyncSseventList = new ArrayList<>();
        for (YcvsSsevntInfo ssevnt: sseventList) {
            Map<String, Object> itemParam = new HashMap<String, Object>();
            itemParam.put("svcTypeCd", svcTypeCd);
            itemParam.put("strCd", strCd);
            itemParam.put("ssevntSeqno", ssevnt.getSsevntSeqno());
            itemParam.put("custNo", custNo);
            itemParam.put("sessnId", sessnId);
            itemParam.put("wdImgPath", wdImgPath);
            itemParam.put("gsfreshItemImgCdnPath", gsfreshItemImgCdnPath);

            // 비동기 객체 생성
            CompletableFuture<Void> asyncObject = CompletableFuture.runAsync(() -> {
                /* storeMode, custNo, sessnId, strCd  */
                List<YcvsItemInfo> items = this.ycvsSseventGsmcMapper.retrieveYcvsSsevntItemList(itemParam);

                if (items != null && !items.isEmpty()) {
                    int lastIndex = items.size() >= 20 ? 19 : items.size() - 1;
                    ssevnt.setItems(items.subList(0, lastIndex));
                }
            });
            // 리스트에 넣는다.
            asyncSseventList.add(asyncObject);
        }
        // 전체 병렬 처리 시작 및 대기(jdk8에선 join 걸어야 전체 실행이 보장된다)
        CompletableFuture.allOf(asyncSseventList.toArray(new CompletableFuture[0])).join();

        //기획전 내 상품이 있는 기획전만 추출
        List<YcvsSsevntInfo> resultList = sseventList.stream().filter(ssevent -> ssevent.getItems() != null && !ssevent.getItems().isEmpty()).collect(Collectors.toList());
        return resultList;
    }
반응형

댓글