Не удается запустить 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?

Другие вопросы по тегам