I want to create a secured web application where users can launch Spring Batch jobs. I want to keep track about who launched which job and thus I have to associate a JobInstance
(or a JobExecution
?) with a user. I additionally want to query for JobExecution
s that were started by a particular user. This does not seem to be a common use case since I could not find a solution for this in the reference guide.
Do I have to write my own implementations for the persistence layer of Spring Batch? This seems to be much overhead for just adding a field to a table. Does anybody know a simple solution?
Advertisement
Answer
As @Artem Bilan suggested I inject the current user into the JobParameters
. I have written a simple service class that provides a method that queries for the execution ids of a given user:
@Service public class JobService { private static final String FIND_EXECUTIONS = "SELECT JOB_EXECUTION_ID FROM batch_job_execution_params WHERE KEY_NAME = 'user' AND STRING_VAL = ? ORDER BY JOB_EXECUTION_ID DESC"; @Autowired private JdbcTemplate jdbcTemplate; public List<Long> findJobExecutionIdsByUser(String username) { return jdbcTemplate.queryForList(FIND_EXECUTIONS, Long.class, username); } }
With this list I am able to get the JobExecution
s from the default JobExplorer
like this:
final List<Long> executionIds = jobService.findJobExecutionIdsByUser("user"); final List<JobExecution> executions = new ArrayList<>(); for (Long executionId : executionIds) { final JobExecution execution = explorer.getJobExecution(executionId); if (execution != null) { executions.add(execution); } }