Не удается запустить Spring TaskScheduler из приложения Spring Batch Admin
У меня есть весенний пакетный проект администратора (1.3.0.RC1), и я пытаюсь включить TaskScheduler для запуска задания с использованием выражения cron.
У меня есть один проект для администратора пакетной версии, и у меня есть другой проект с моей пакетной работой. Я могу отлично выполнить задание через консоль администратора вручную (это означает, что оно отлично загружается и работает). Задание никогда не выполняется по расписанию cron.
Если я настрою java-класс с помощью метода main и запусту его как java-приложение, используя тот же xml-файл задания, задание будет выполнено по расписанию cron (другими словами, запустите задание вне консоли администрирования batch Spring). Это также должно проверить, что с конфигурацией XML все в порядке.
это работает: project2 app.java
public static void main(String[] args) {
String springConfig = "META-INF/spring/batch/jobs/scheduleTest.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);
}
project2 META-INF / spring / jobs / scheduleTest.xml
<job id="test-job"
xmlns="http://www.springframework.org/schema/batch">
<step id="testJob">
<tasklet transaction-manager="transactionManager" ref="testOutput"/>
</step>
</job>
<bean id="testOutput" class="com.default.test.testOutput" />
<task:scheduled-tasks>
<task:scheduled ref="runIt" method="run" cron="30 * * * * ?" />
</task:scheduled-tasks>
<bean id="runIt" class="com.default.scheduler.RunScheduler">
<property name="job" ref="test-job" />
<property name="jobLauncher" ref="jobLauncher"/>
<property name="runCron" value="true" />
</bean>
Задание выполняется каждые 30 секунд и выводит некоторые тестовые данные на консоль.
Не работает: когда я запускаю консоль Spring Batch Admin, project2 упаковывается вместе с project1, файл job.xml становится частью пути к классам, а задание регистрируется в консоли и запускается. Я могу запустить его из консоли, и он работает нормально, но он не запускается в назначенное время автоматически. Он также не запускается в назначенное время после того, как я выполню его вручную.
Кто-нибудь видит, что я здесь делаю не так? Любые указатели будут с благодарностью. Или, если кто-нибудь знает пример использования Spring TaskScheduler (не кварца) в SBA, это также будет полезно. Заранее спасибо. Я предполагаю, что выражение cron сохраняется в контексте приложения, которое больше не существует или не известно консоли SBA.
1 ответ
У меня такая же проблема в SBA 1.3.0. ВЫПУСК. Он работает с основным методом, который вручную загружает контекст, но в SBA он не запускает TaskScheduler.
Для целей отладки у меня есть ApplicationListener. В методе onApplicationEvent я вручную создаю и запускаю свой собственный TaskScheduler.
META-INF / весна / партии / работы / SBA-configuration.xml
<job id="test-job"
xmlns="http://www.springframework.org/schema/batch">
<step id="testJob">
<tasklet transaction-manager="transactionManager" ref="testOutput"/>
</step>
</job>
<bean id="testOutput" class="com.default.test.testOutput" />
<task:scheduled-tasks>
<task:scheduled ref="runIt" method="run" cron="30 * * * * ?" />
</task:scheduled-tasks>
<bean id="runIt" class="com.default.scheduler.RunScheduler">
<property name="job" ref="test-job" />
<property name="jobLauncher" ref="jobLauncher"/>
<property name="runCron" value="true" />
</bean>
<bean id="appContextListener" class="com.qmn.AppContextListener" />
<bean id="myJobRunner" class="com.qmn.MyJobRunner"/>
<task:scheduler id="scheduler" pool-size="10" />
com.qmn.AppContextListener
public class AppContextListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private WebApplicationContext wac; //this context doesn't contain beans which are in sba-configuration.xml
@Autowired
private ThreadPoolTaskScheduler scheduler; //in sba-configuration.xml but doesn't have in wac. Spring still injects success.
@Autowired
private MyJobRunner myJobRunner; //in sba-configuration.xml but doesn't have in wac
@Autowired
private Job job; //in sba-configuration.xml but doesn't have in wac
@Autowired
private JobLauncher jobLauncher; // default jobLauncher of SBA
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
XmlWebApplicationContext context = contextRefreshedEvent.getSource() instanceof XmlWebApplicationContext ?
(XmlWebApplicationContext) contextRefreshedEvent.getSource() : null;
if(context != null && context.getNamespace().contains("Batch Servlet")) { // only work with my spring batch admin servlet
myJobRunner.setJob(job);
myJobRunner.setJobLauncher(jobLauncher);
CronTrigger trigger = new CronTrigger("*/5 * * * * *");
ScheduledFuture<?> scedulefuture = scheduler.schedule(myJobRunner, trigger);
}
}
}
Код работает хорошо, запускайте работу каждые 5 секунд. Так что я думаю, SBA съел TaskScheduler, который определен в конфиге xml. Это ошибка Spring Batch Admin?