24
24
import java .util .ArrayList ;
25
25
import java .util .Arrays ;
26
26
import java .util .Collection ;
27
- import java .util .Comparator ;
28
27
import java .util .Iterator ;
29
28
import java .util .List ;
30
29
import java .util .concurrent .locks .Lock ;
41
40
import org .springframework .beans .factory .InitializingBean ;
42
41
import org .springframework .dao .OptimisticLockingFailureException ;
43
42
import org .springframework .jdbc .core .BatchPreparedStatementSetter ;
43
+ import org .springframework .jdbc .core .PreparedStatementCallback ;
44
44
import org .springframework .jdbc .core .RowMapper ;
45
45
import org .springframework .jdbc .support .incrementer .DataFieldMaxValueIncrementer ;
46
46
import org .springframework .lang .Nullable ;
66
66
* @author Mahmoud Ben Hassine
67
67
* @author Baris Cubukcuoglu
68
68
* @author Minsoo Kim
69
+ * @author Yanming Zhou
69
70
* @see StepExecutionDao
70
71
*/
71
72
public class JdbcStepExecutionDao extends AbstractJdbcBatchMetadataDao implements StepExecutionDao , InitializingBean {
@@ -98,6 +99,7 @@ public class JdbcStepExecutionDao extends AbstractJdbcBatchMetadataDao implement
98
99
FROM %PREFIX%JOB_EXECUTION JE
99
100
JOIN %PREFIX%STEP_EXECUTION SE ON SE.JOB_EXECUTION_ID = JE.JOB_EXECUTION_ID
100
101
WHERE JE.JOB_INSTANCE_ID = ? AND SE.STEP_NAME = ?
102
+ ORDER BY SE.CREATE_TIME DESC, SE.JOB_EXECUTION_ID DESC
101
103
""" ;
102
104
103
105
private static final String CURRENT_VERSION_STEP_EXECUTION = """
@@ -117,10 +119,6 @@ SELECT COUNT(*)
117
119
WHERE STEP_EXECUTION_ID = ?
118
120
""" ;
119
121
120
- private static final Comparator <StepExecution > BY_CREATE_TIME_DESC_ID_DESC = Comparator
121
- .comparing (StepExecution ::getCreateTime , Comparator .reverseOrder ())
122
- .thenComparing (StepExecution ::getId , Comparator .reverseOrder ());
123
-
124
122
private int exitMessageLength = DEFAULT_EXIT_MESSAGE_LENGTH ;
125
123
126
124
private DataFieldMaxValueIncrementer stepExecutionIncrementer ;
@@ -337,27 +335,34 @@ public StepExecution getStepExecution(JobExecution jobExecution, Long stepExecut
337
335
}
338
336
}
339
337
338
+ @ Nullable
340
339
@ Override
341
340
public StepExecution getLastStepExecution (JobInstance jobInstance , String stepName ) {
342
- List <StepExecution > executions = getJdbcTemplate ().query (getQuery (GET_LAST_STEP_EXECUTION ), (rs , rowNum ) -> {
343
- Long jobExecutionId = rs .getLong (19 );
344
- JobExecution jobExecution = new JobExecution (jobExecutionId );
345
- jobExecution .setStartTime (rs .getTimestamp (20 ) == null ? null : rs .getTimestamp (20 ).toLocalDateTime ());
346
- jobExecution .setEndTime (rs .getTimestamp (21 ) == null ? null : rs .getTimestamp (21 ).toLocalDateTime ());
347
- jobExecution .setStatus (BatchStatus .valueOf (rs .getString (22 )));
348
- jobExecution .setExitStatus (new ExitStatus (rs .getString (23 ), rs .getString (24 )));
349
- jobExecution .setCreateTime (rs .getTimestamp (25 ) == null ? null : rs .getTimestamp (25 ).toLocalDateTime ());
350
- jobExecution .setLastUpdated (rs .getTimestamp (26 ) == null ? null : rs .getTimestamp (26 ).toLocalDateTime ());
351
- jobExecution .setVersion (rs .getInt (27 ));
352
- return new StepExecutionRowMapper (jobExecution ).mapRow (rs , rowNum );
353
- }, jobInstance .getInstanceId (), stepName );
354
- executions .sort (BY_CREATE_TIME_DESC_ID_DESC );
355
- if (executions .isEmpty ()) {
356
- return null ;
357
- }
358
- else {
359
- return executions .get (0 );
360
- }
341
+ return getJdbcTemplate ().execute (getQuery (GET_LAST_STEP_EXECUTION ),
342
+ (PreparedStatementCallback <StepExecution >) statement -> {
343
+ statement .setMaxRows (1 );
344
+ statement .setLong (1 , jobInstance .getInstanceId ());
345
+ statement .setString (2 , stepName );
346
+ try (ResultSet rs = statement .executeQuery ()) {
347
+ if (rs .next ()) {
348
+ Long jobExecutionId = rs .getLong (19 );
349
+ JobExecution jobExecution = new JobExecution (jobExecutionId );
350
+ jobExecution .setStartTime (
351
+ rs .getTimestamp (20 ) == null ? null : rs .getTimestamp (20 ).toLocalDateTime ());
352
+ jobExecution
353
+ .setEndTime (rs .getTimestamp (21 ) == null ? null : rs .getTimestamp (21 ).toLocalDateTime ());
354
+ jobExecution .setStatus (BatchStatus .valueOf (rs .getString (22 )));
355
+ jobExecution .setExitStatus (new ExitStatus (rs .getString (23 ), rs .getString (24 )));
356
+ jobExecution .setCreateTime (
357
+ rs .getTimestamp (25 ) == null ? null : rs .getTimestamp (25 ).toLocalDateTime ());
358
+ jobExecution .setLastUpdated (
359
+ rs .getTimestamp (26 ) == null ? null : rs .getTimestamp (26 ).toLocalDateTime ());
360
+ jobExecution .setVersion (rs .getInt (27 ));
361
+ return new StepExecutionRowMapper (jobExecution ).mapRow (rs , 0 );
362
+ }
363
+ return null ;
364
+ }
365
+ });
361
366
}
362
367
363
368
@ Override
0 commit comments