spring-cloud/spring-cloud-task

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); 
                  
            }
      }

}

Resolved with commit :7cd9863

Thank you for bringing this up!