parentExecutionId is null
railsmith opened this issue · 2 comments
I am trying to read the parent execution ID in child task using Spring Cloud Task @BeforeTask method but getting null. The task is triggered from SCDF.
The parent execution ID is getting printed in the string method of the TaskExecution class highlighted in the log shared below, but in the getter it is returning null.
2023-12-15T19:47:21.234+05:30 DEBUG 1 --- [ main] o.s.c.t.r.support.SimpleTaskRepository : Starting: TaskExecution{executionId=2346, parentExecutionId=2345, exitCode=null, taskName='compexec1-compexec', startTime=2023-12-15T19:47:20.911299457, endTime=null, exitMessage='null', externalExecutionId='null', errorMessage='null', arguments=[}
Inside BeforeTask Start New
child execId 2346
Parent execId null
Please find below code snippet.
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.cloud.task.listener.annotation.AfterTask;
import org.springframework.cloud.task.listener.annotation.BeforeTask;
import org.springframework.cloud.task.repository.TaskExecution;
import org.springframework.stereotype.Component;
@Component
public class SampleCommandLineRunner implements ApplicationRunner {
@Value("${failure}")
private boolean failure;
private List<DataSource> dataSources;
@Autowired
public SampleCommandLineRunner(List<DataSource> dataSources) {
this.dataSources = dataSources;
}
@BeforeTask
public void beforeTask(TaskExecution taskExecution) {
System.out.println("Inside BeforeTask Start New ");
System.out.println("child execId " + taskExecution.getExecutionId());
//taskExecution.setParentExecutionId((long) 1443);
//taskExecution.setExternalExecutionId("abc");
System.out.println("Parent execId " + taskExecution.getParentExecutionId());
System.out.println("getTaskName execId " + taskExecution.getTaskName());
MDC.put("executionId", String.valueOf(taskExecution.getExecutionId()));
System.out.println("Inside BeforeTask End ");
}
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("There are " + this.dataSources.size() + " DataSources within this application");
System.out.println(args.getOptionNames());
System.out.println("run method start : ");
List<String> fileId = args.getOptionValues("fileid");
System.out.println("fileID: " + fileId);
System.out.println("executionId : " + MDC.get("executionId"));
}
@AfterTask
public void onTaskEnd(TaskExecution taskExecution) {
System.out.println("AfterTask : " + MDC.get("executionId"));
System.out.println("child execId " + taskExecution.getExecutionId());
System.out.println("Parent execId " + taskExecution.getParentExecutionId());
System.out.println("Parent execId " + taskExecution.getExternalExecutionId());
System.out.println("Parent execId " + taskExecution.getTaskName());
System.out.println("getEndTime execId " + taskExecution.getEndTime());
System.out.println("Boolean : " + failure);
if(failure) {
System.out.println("if : " + failure);
taskExecution.setExitCode(1);
}
else {
System.out.println("else : " + failure);
taskExecution.setExitCode(0);
}
}
}
In Spring Cloud Task, need to set the parentId parameter in the constructor: https://github.com/spring-cloud/spring-cloud-task/blob/main/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/repository/dao/JdbcTaskExecutionDao.java#L221-L222
Need to set the parentId in the constructor used in getTaskExecutionCopy
here: https://github.com/spring-cloud/spring-cloud-task/blob/main/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/listener/TaskLifecycleListener.java#L391-L394