1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.batch.core.configuration.support;
18
19 import java.util.ArrayList;
20 import java.util.Collection;
21
22 import org.springframework.batch.core.Job;
23 import org.springframework.batch.core.configuration.DuplicateJobException;
24 import org.springframework.batch.core.configuration.JobRegistry;
25 import org.springframework.beans.factory.InitializingBean;
26 import org.springframework.context.ApplicationContext;
27 import org.springframework.context.ApplicationContextAware;
28 import org.springframework.context.ApplicationEvent;
29 import org.springframework.context.ApplicationListener;
30 import org.springframework.context.Lifecycle;
31 import org.springframework.context.event.ContextClosedEvent;
32 import org.springframework.context.event.ContextRefreshedEvent;
33 import org.springframework.core.Ordered;
34 import org.springframework.util.Assert;
35
36
37
38
39
40
41
42
43
44
45
46 public class AutomaticJobRegistrar implements Ordered, Lifecycle, ApplicationListener, ApplicationContextAware,
47 InitializingBean {
48
49 private Collection<ApplicationContextFactory> applicationContextFactories = new ArrayList<ApplicationContextFactory>();
50
51 private JobLoader jobLoader;
52
53 private ApplicationContext applicationContext;
54
55 private volatile boolean running = false;
56
57 private Object lifecycleMonitor = new Object();
58
59 private int order = Ordered.LOWEST_PRECEDENCE;
60
61
62
63
64
65
66
67
68 @Override
69 public void setApplicationContext(ApplicationContext applicationContext) {
70 this.applicationContext = applicationContext;
71 }
72
73
74
75
76
77
78 public void addApplicationContextFactory(ApplicationContextFactory applicationContextFactory) {
79 if (applicationContextFactory instanceof ApplicationContextAware) {
80 ((ApplicationContextAware) applicationContextFactory).setApplicationContext(applicationContext);
81 }
82 this.applicationContextFactories.add(applicationContextFactory);
83 }
84
85
86
87
88
89
90 public void setApplicationContextFactories(ApplicationContextFactory[] applicationContextFactories) {
91 for (ApplicationContextFactory applicationContextFactory : applicationContextFactories) {
92 this.applicationContextFactories.add(applicationContextFactory);
93 }
94 }
95
96
97
98
99
100
101 public void setJobLoader(JobLoader jobLoader) {
102 this.jobLoader = jobLoader;
103 }
104
105 @Override
106 public int getOrder() {
107 return order;
108 }
109
110
111
112
113
114
115 public void setOrder(int order) {
116 this.order = order;
117 }
118
119
120
121 @Override
122 public void afterPropertiesSet() {
123
124 Assert.state(jobLoader != null, "A JobLoader must be provided");
125
126 }
127
128
129
130
131
132
133
134 @Override
135 public final void onApplicationEvent(ApplicationEvent event) {
136
137 if (event.getSource() == applicationContext) {
138 if (event instanceof ContextRefreshedEvent) {
139 start();
140 }
141 else if (event instanceof ContextClosedEvent) {
142 stop();
143 }
144 }
145 }
146
147
148
149
150
151
152 @Override
153 public void stop() {
154 synchronized (this.lifecycleMonitor) {
155 jobLoader.clear();
156 running = false;
157 }
158 }
159
160
161
162
163
164
165 @Override
166 public void start() {
167 synchronized (this.lifecycleMonitor) {
168 if (running) {
169 return;
170 }
171 for (ApplicationContextFactory factory : applicationContextFactories) {
172 try {
173 jobLoader.load(factory);
174 }
175 catch (DuplicateJobException e) {
176 throw new IllegalStateException(e);
177 }
178 }
179 running = true;
180 }
181 }
182
183
184
185
186
187
188
189 @Override
190 public boolean isRunning() {
191 synchronized (this.lifecycleMonitor) {
192 return running;
193 }
194 }
195
196 }