簡體   English   中英

Spring Boot - 並行執行 setter 語句以優化響應時間

[英]Spring Boot - Execute setter statements in parallel to optimise response time

我有一個場景,我使用一些邏輯填充 DTO 對象。 這個 DTO 對象有 8 個對象。 所有這 8 個對象都是相互獨立的。 因此,在我的服務類中,我目前正在按順序調用所有 8 個 setter 方法,然后返回 DTO 對象。

public PipelineAndActivitiesForDashboard customerpipeline(DashboardData payload) throws Exception
    {
        PipelineAndActivitiesForDashboard dashboardPipelineReturnData = new PipelineAndActivitiesForDashboard();
        List<LeadActivity> data = new ArrayList<LeadActivity>();
        Date fromdate = payload.getFromDate();
        Date todate = payload.getToDate();

        log.info("fromdate : " + fromdate + " todate: " + todate);
        data = lRepo.getActivity(fromdate, todate);

        log.info("Fetching Lead Generated Stats");
        dashboardPipelineReturnData.setLeadGenerated(// some logic to fetch values from data );

        log.info("Fetching Activities Created Stats");
        dashboardPipelineReturnData.setActivitiesCreated(// some logic to fetch values from data);

        log.info("Fetching Property Visit Stats");
        dashboardPipelineReturnData.setTotalPropertyVisit(// some logic to fetch values from data);

        log.info("Fetching Deal close Stats");
        dashboardPipelineReturnData.setDealClosed(// some logic to fetch values from data);

        log.info("Fetching deal lost Stats");
        dashboardPipelineReturnData.setDealLost(// some logic to fetch values from data);

        log.info("Fetching today's activities Stats");
        dashboardPipelineReturnData.setTodaysActivities(some logic to fetch values from data);

        log.info("Fetching pending activities Stats");
        dashboardPipelineReturnData.setPendingActivities(some logic to fetch values from data);

        log.info("Fetching upcoming activities Stats");
        dashboardPipelineReturnData.setUpcomingActivities(some logic to fetch values from data);

        return dashboardPipelineReturnData;

    }

每個邏輯需要大約 5 秒的處理時間。 因此,按順序執行 8 會使響應變慢。

我正在尋找一些幫助來識別可在此處使用以並行觸發這 8 個 setter 方法的 java 或 spring 概念。

所以流量應該是

  1. 所有 8 個 setter 都應該並行觸發
  2. 在所有 8 個 setter 方法執行完成之前,控制不應到達 return 語句

您可以將多線程與循環屏障一起使用。 循環障礙用於程序中,在這些程序中,我們有固定數量的線程,這些線程在繼續執行之前必須等待彼此到達共同點。 您可以為需要處理的每個 setter 創建一個 Runnable 作業。 由於我們使用循環屏障,所有線程將並行運行並等待所有線程都完成執行,然后才能返回最終對象。

偽代碼 -

public class Test {

    public static void main(String[] args) {

        ExecutorService executors = Executors.newFixedThreadPool(8);
        CyclicBarrier barrier = new CyclicBarrier(8);

        executors.submit(new SetLeadGenerated(barrier,dashboardPipelineReturnData));
        //submit the runnable job for all other setter methods

        // at this point dashboardPipelineReturnData will be updated with all the data
    }

}

class SetLeadGenerated implements Runnable {

    private CyclicBarrier barrier;
    private PipelineAndActivitiesForDashboard  dashboardPipelineReturnData;

    public SetLeadGenerated(CyclicBarrier barrier,PipelineAndActivitiesForDashboard dashboardPipelineReturnData) {
    
        this.dashboardPipelineReturnData = dashboardPipelineReturnData;
        this.barrier = barrier;
    }

    @Override
    public void run()  {
   
        try {   
       //do your task here
       dashboardPipelineReturnData.setLeadGenerated(// some logic to fetch values from data );
        
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
        finally {
            barrier.await();
        }

       
    }

}

一旦調用 await() 的線程數等於 numberOfThreads,屏障就會為等待線程提供一條路

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM