Skip to content

Commit 5b2f1dd

Browse files
committed
DTS-50661: Review comment fixes, removed redundant ex try,catch and recommendation jobStrategy fix
Change-log: Batch processing ai-recommendation for performance improvement.
1 parent 7b5cb98 commit 5b2f1dd

File tree

3 files changed

+53
-141
lines changed

3 files changed

+53
-141
lines changed

ai-data-processor/src/main/java/com/publicissapient/kpidashboard/job/recommendationcalculation/config/RecommendationCalculationBatchConfig.java

Lines changed: 0 additions & 102 deletions
This file was deleted.

ai-data-processor/src/main/java/com/publicissapient/kpidashboard/job/recommendationcalculation/service/RecommendationCalculationService.java

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -70,36 +70,21 @@ public class RecommendationCalculationService {
7070
public RecommendationsActionPlan calculateRecommendationsForProject(@NonNull ProjectInputDTO projectInput) {
7171
Persona persona = recommendationCalculationConfig.getCalculationConfig().getEnabledPersona();
7272

73-
try {
74-
log.info("{} Calculating recommendations for project: {} ({}) - Persona: {}",
75-
JobConstants.LOG_PREFIX_RECOMMENDATION, projectInput.name(), projectInput.nodeId(),
76-
persona.getDisplayName());
77-
78-
// Delegate KPI data extraction to specialized service
79-
Map<String, Object> kpiData = kpiDataExtractionService.fetchKpiDataForProject(projectInput);
80-
81-
// Build prompt using PromptService with actual KPI data
82-
String prompt = promptService.getKpiRecommendationPrompt(kpiData, persona);
83-
84-
ChatGenerationRequest request = ChatGenerationRequest.builder().prompt(prompt).build();
85-
86-
ChatGenerationResponseDTO response = aiGatewayClient.generate(request);
87-
88-
return buildRecommendationsActionPlan(projectInput, persona, response);
89-
} catch (IllegalStateException e) {
90-
// Parsing or validation failures - rethrow as-is
91-
log.error("{} Validation error for project {} persona {}: {}",
92-
JobConstants.LOG_PREFIX_RECOMMENDATION, projectInput.nodeId(), persona.getDisplayName(),
93-
e.getMessage(), e);
94-
throw e;
95-
} catch (RuntimeException e) {
96-
// API call failures, network issues - wrap with context
97-
log.error("{} Runtime error calculating recommendations for project {} persona {}: {}",
98-
JobConstants.LOG_PREFIX_RECOMMENDATION, projectInput.nodeId(), persona.getDisplayName(),
99-
e.getMessage(), e);
100-
throw new IllegalStateException("Failed to calculate recommendations for project: " + projectInput.nodeId(),
101-
e);
102-
}
73+
log.info("{} Calculating recommendations for project: {} ({}) - Persona: {}",
74+
JobConstants.LOG_PREFIX_RECOMMENDATION, projectInput.name(), projectInput.nodeId(),
75+
persona.getDisplayName());
76+
77+
// Delegate KPI data extraction to specialized service
78+
Map<String, Object> kpiData = kpiDataExtractionService.fetchKpiDataForProject(projectInput);
79+
80+
// Build prompt using PromptService with actual KPI data
81+
String prompt = promptService.getKpiRecommendationPrompt(kpiData, persona);
82+
83+
ChatGenerationRequest request = ChatGenerationRequest.builder().prompt(prompt).build();
84+
85+
ChatGenerationResponseDTO response = aiGatewayClient.generate(request);
86+
87+
return buildRecommendationsActionPlan(projectInput, persona, response);
10388
}
10489

10590
/**

ai-data-processor/src/main/java/com/publicissapient/kpidashboard/job/recommendationcalculation/strategy/RecommendationCalculationJobStrategy.java

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,24 @@
2525
import org.springframework.batch.core.job.builder.JobBuilder;
2626
import org.springframework.batch.core.repository.JobRepository;
2727
import org.springframework.batch.core.step.builder.StepBuilder;
28+
import org.springframework.batch.integration.async.AsyncItemProcessor;
29+
import org.springframework.batch.integration.async.AsyncItemWriter;
30+
import org.springframework.core.task.TaskExecutor;
2831
import org.springframework.stereotype.Component;
2932
import org.springframework.transaction.PlatformTransactionManager;
3033

3134
import com.publicissapient.kpidashboard.common.model.recommendation.batch.RecommendationsActionPlan;
35+
import com.publicissapient.kpidashboard.common.repository.recommendation.RecommendationRepository;
36+
import com.publicissapient.kpidashboard.common.service.JobExecutionTraceLogService;
37+
import com.publicissapient.kpidashboard.common.service.ProcessorExecutionTraceLogService;
3238
import com.publicissapient.kpidashboard.job.config.base.SchedulingConfig;
33-
import com.publicissapient.kpidashboard.job.recommendationcalculation.config.RecommendationCalculationBatchConfig;
3439
import com.publicissapient.kpidashboard.job.recommendationcalculation.config.RecommendationCalculationConfig;
3540
import com.publicissapient.kpidashboard.job.recommendationcalculation.listener.RecommendationCalculationJobExecutionListener;
41+
import com.publicissapient.kpidashboard.job.recommendationcalculation.processor.ProjectItemProcessor;
42+
import com.publicissapient.kpidashboard.job.recommendationcalculation.reader.ProjectItemReader;
43+
import com.publicissapient.kpidashboard.job.recommendationcalculation.service.RecommendationCalculationService;
44+
import com.publicissapient.kpidashboard.job.recommendationcalculation.service.RecommendationProjectBatchService;
45+
import com.publicissapient.kpidashboard.job.recommendationcalculation.writer.ProjectItemWriter;
3646
import com.publicissapient.kpidashboard.job.shared.dto.ProjectInputDTO;
3747
import com.publicissapient.kpidashboard.job.strategy.JobStrategy;
3848

@@ -46,11 +56,15 @@
4656
@RequiredArgsConstructor
4757
public class RecommendationCalculationJobStrategy implements JobStrategy {
4858

49-
private final RecommendationCalculationConfig recommendationCalculationConfig;
50-
private final RecommendationCalculationBatchConfig batchConfig;
51-
private final PlatformTransactionManager platformTransactionManager;
5259
private final JobRepository jobRepository;
53-
private final RecommendationCalculationJobExecutionListener jobExecutionListener;
60+
private final TaskExecutor taskExecutor;
61+
private final PlatformTransactionManager platformTransactionManager;
62+
private final RecommendationCalculationConfig recommendationCalculationConfig;
63+
private final RecommendationProjectBatchService projectBatchService;
64+
private final RecommendationCalculationService recommendationCalculationService;
65+
private final JobExecutionTraceLogService jobExecutionTraceLogService;
66+
private final ProcessorExecutionTraceLogService processorExecutionTraceLogService;
67+
private final RecommendationRepository recommendationRepository;
5468

5569
@Override
5670
public String getJobName() {
@@ -65,18 +79,33 @@ public Optional<SchedulingConfig> getSchedulingConfig() {
6579
@Override
6680
public Job getJob() {
6781
return new JobBuilder(recommendationCalculationConfig.getName(), jobRepository).start(chunkProcessProjects())
68-
.listener(jobExecutionListener).build();
82+
.listener(new RecommendationCalculationJobExecutionListener(this.projectBatchService,
83+
this.jobExecutionTraceLogService))
84+
.build();
6985
}
7086

7187
private Step chunkProcessProjects() {
7288
return new StepBuilder(String.format("%s-chunk-process", recommendationCalculationConfig.getName()),
7389
jobRepository)
7490
.<ProjectInputDTO, Future<RecommendationsActionPlan>>chunk(
7591
recommendationCalculationConfig.getBatching().getChunkSize(), platformTransactionManager)
92+
.reader(new ProjectItemReader(this.projectBatchService)).processor(asyncProjectProcessor())
93+
.writer(asyncItemWriter()).build();
94+
}
95+
96+
private AsyncItemProcessor<ProjectInputDTO, RecommendationsActionPlan> asyncProjectProcessor() {
97+
AsyncItemProcessor<ProjectInputDTO, RecommendationsActionPlan> asyncItemProcessor = new AsyncItemProcessor<>();
98+
asyncItemProcessor.setDelegate(new ProjectItemProcessor(this.recommendationCalculationService,
99+
this.processorExecutionTraceLogService));
100+
asyncItemProcessor.setTaskExecutor(taskExecutor);
101+
return asyncItemProcessor;
102+
}
76103

77-
.reader(batchConfig.recommendationProjectItemReader())
78-
.processor(batchConfig.recommendationAsyncProjectProcessor())
79-
.writer(batchConfig.recommendationAsyncItemWriter()).build();
104+
private AsyncItemWriter<RecommendationsActionPlan> asyncItemWriter() {
105+
AsyncItemWriter<RecommendationsActionPlan> writer = new AsyncItemWriter<>();
106+
writer.setDelegate(
107+
new ProjectItemWriter(this.recommendationRepository, this.processorExecutionTraceLogService));
108+
return writer;
80109
}
81110

82111
}

0 commit comments

Comments
 (0)