[英]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 概念。
所以流量應該是
您可以將多線程與循環屏障一起使用。 循環障礙用於程序中,在這些程序中,我們有固定數量的線程,這些線程在繼續執行之前必須等待彼此到達共同點。 您可以為需要處理的每個 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.