1

春のバッチ管理プロジェクト (1.3.0.RC1) があり、TaskScheduler が cron 式を使用してジョブを実行できるようにしようとしています。

春のバッチ管理用のプロジェクトが 1 つあり、バッチ ジョブを含む別のプロジェクトがあります。管理コンソールから手動で問題なくジョブを実行できます(つまり、問題なくロードされ、機能します)。ただし、ジョブはcronスケジュールで実行されることはありません。

main メソッドを使用して Java クラスを構成し、同じジョブ xml ファイルを使用して Java アプリケーションとして実行すると、ジョブは cron スケジュールで実行されます (つまり、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 管理コンソールを実行すると、project2 が project1 にパッケージ化され、job.xml ファイルがクラスパスの一部になり、ジョブがコンソールに登録されて起動可能になります。コンソールから実行でき、正常に動作しますが、スケジュールされた時間に自動的に実行されません。また、手動で実行した後、スケジュールされた時間に実行を開始しません。

ここで私が間違っていることを誰かが見ていますか?任意のポインタをいただければ幸いです。または、SBA で Spring TaskScheduler (クォーツではない) を使用する例を誰かが知っていれば、それも役に立ちます。前もって感謝します。私の推測では、cron 式は、もはや存在しないか、SBA コンソールに認識されていないアプリケーション コンテキストに格納されています。

4

1 に答える 1

0

SBA 1.3.0.RELEASE でも同じ問題があります。コンテキストを手動でロードする main メソッドで動作しますが、SBA では TaskScheduler を実行しません。

デバッグの目的で、ApplicationListener があります。onApplicationEvent メソッドでは、独自の TaskScheduler を手動で作成して実行します。

META-INF/spring/batch/jobs/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 は xml 構成で定義されている TaskScheduler を食べたと思います。これは Spring Batch Admin のバグですか?

于 2014-11-07T10:25:02.363 に答える