1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.springframework.batch.core.step.builder;
17
18 import java.util.LinkedHashSet;
19 import java.util.Set;
20
21 import org.springframework.batch.core.ChunkListener;
22 import org.springframework.batch.core.Step;
23 import org.springframework.batch.core.step.tasklet.Tasklet;
24 import org.springframework.batch.core.step.tasklet.TaskletStep;
25 import org.springframework.batch.item.ItemStream;
26 import org.springframework.batch.repeat.RepeatOperations;
27 import org.springframework.batch.repeat.exception.DefaultExceptionHandler;
28 import org.springframework.batch.repeat.exception.ExceptionHandler;
29 import org.springframework.batch.repeat.support.RepeatTemplate;
30 import org.springframework.batch.repeat.support.TaskExecutorRepeatTemplate;
31 import org.springframework.core.task.SyncTaskExecutor;
32 import org.springframework.core.task.TaskExecutor;
33 import org.springframework.transaction.interceptor.TransactionAttribute;
34
35
36
37
38
39
40
41
42
43
44
45 public abstract class AbstractTaskletStepBuilder<B extends AbstractTaskletStepBuilder<B>> extends
46 StepBuilderHelper<AbstractTaskletStepBuilder<B>> {
47
48 private Set<ChunkListener> listeners = new LinkedHashSet<ChunkListener>();
49
50 private RepeatOperations stepOperations;
51
52 private TransactionAttribute transactionAttribute;
53
54 private Set<ItemStream> streams = new LinkedHashSet<ItemStream>();
55
56 private ExceptionHandler exceptionHandler = new DefaultExceptionHandler();
57
58 private int throttleLimit = TaskExecutorRepeatTemplate.DEFAULT_THROTTLE_LIMIT;
59
60 private TaskExecutor taskExecutor;
61
62 public AbstractTaskletStepBuilder(StepBuilderHelper<?> parent) {
63 super(parent);
64 }
65
66 protected abstract Tasklet createTasklet();
67
68
69
70
71
72
73
74 public TaskletStep build() {
75
76 TaskletStep step = new TaskletStep(getName());
77
78 super.enhance(step);
79
80 step.setChunkListeners(listeners.toArray(new ChunkListener[0]));
81
82 if (transactionAttribute != null) {
83 step.setTransactionAttribute(transactionAttribute);
84 }
85
86 if (stepOperations == null) {
87
88 stepOperations = new RepeatTemplate();
89
90 if (taskExecutor != null) {
91 TaskExecutorRepeatTemplate repeatTemplate = new TaskExecutorRepeatTemplate();
92 repeatTemplate.setTaskExecutor(taskExecutor);
93 repeatTemplate.setThrottleLimit(throttleLimit);
94 stepOperations = repeatTemplate;
95 }
96
97 ((RepeatTemplate) stepOperations).setExceptionHandler(exceptionHandler);
98
99 }
100 step.setStepOperations(stepOperations);
101 step.setTasklet(createTasklet());
102
103 step.setStreams(streams.toArray(new ItemStream[0]));
104
105 try {
106 step.afterPropertiesSet();
107 }
108 catch (Exception e) {
109 throw new StepBuilderException(e);
110 }
111
112 return step;
113
114 }
115
116
117
118
119
120
121
122 public AbstractTaskletStepBuilder<B> listener(ChunkListener listener) {
123 listeners.add(listener);
124 return this;
125 }
126
127
128
129
130
131
132
133 public AbstractTaskletStepBuilder<B> stream(ItemStream stream) {
134 streams.add(stream);
135 return this;
136 }
137
138
139
140
141
142
143
144
145 public AbstractTaskletStepBuilder<B> taskExecutor(TaskExecutor taskExecutor) {
146 this.taskExecutor = taskExecutor;
147 return this;
148 }
149
150
151
152
153
154
155
156
157
158 public AbstractTaskletStepBuilder<B> throttleLimit(int throttleLimit) {
159 this.throttleLimit = throttleLimit;
160 return this;
161 }
162
163
164
165
166
167
168
169 public AbstractTaskletStepBuilder<B> exceptionHandler(ExceptionHandler exceptionHandler) {
170 this.exceptionHandler = exceptionHandler;
171 return this;
172 }
173
174
175
176
177
178
179
180
181 public AbstractTaskletStepBuilder<B> stepOperations(RepeatOperations repeatTemplate) {
182 this.stepOperations = repeatTemplate;
183 return this;
184 }
185
186
187
188
189
190
191
192
193 public AbstractTaskletStepBuilder<B> transactionAttribute(TransactionAttribute transactionAttribute) {
194 this.transactionAttribute = transactionAttribute;
195 return this;
196 }
197
198
199
200
201
202
203 protected RepeatOperations getStepOperations() {
204 return stepOperations;
205 }
206
207
208
209
210
211
212 protected ExceptionHandler getExceptionHandler() {
213 return exceptionHandler;
214 }
215
216
217
218
219
220
221 protected boolean concurrent() {
222 boolean concurrent = taskExecutor != null && !(taskExecutor instanceof SyncTaskExecutor);
223 return concurrent;
224 }
225
226 }