当前位置: 首页 > 知识库问答 >
问题:

无法从Spring Batch管理应用程序启动Spring TaskScheduler

楚方伟
2023-03-14

我有一个项目用于spring批处理管理,我有另一个项目与我的批处理作业。我可以通过管理控制台手动执行该作业(这意味着它加载良好并工作)。不过,该作业从不按照cron计划执行。

如果我使用main方法配置java类,并使用相同的作业xml文件将其作为java应用程序运行,则作业将按照cron调度运行(换句话说,在Spring batch管理控制台之外运行作业)。这还应该验证xml配置是否正常。

工作原理:project2 app.java

public static void main(String[] args) {
    String springConfig = "META-INF/spring/batch/jobs/scheduleTest.xml";
    ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);
}
    <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>

有人看到我做错了什么吗?如有任何指示,将不胜感激。或者如果有人知道在SBA中使用Spring TaskScheduler(而不是quartz)的示例,这也会很有帮助。提前谢了。我的猜测是,cron表达式被存储到一个不再存在或SBA控制台不知道的应用程序上下文中。

共有1个答案

郎宏逸
2023-03-14

我在SBA1.3.0.发行版中也遇到了同样的问题。它与手动加载上下文的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" />
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);
        }
    }

}
 类似资料:
  • 我有一些非常类似于下面的代码(我不得不做一些困惑)。我正在获取一个应用程序启动失败的错误。未显示的代码是datasource bean和spring boot application类。当我在debug中放置断点并运行所有bean时,所有bean似乎都被创建了,除了Job和Step bean,这两个bean似乎被完全跳过了。我不确定如何进一步诊断。似乎是一些Spring的魔法问题。任何想法都非常感

  • 我已经在tomcat服务器上安装了应用程序。在启动和加载应用程序的过程中,我有以下堆栈跟踪的错误。如何解决这个问题? apache-tomcat-7.0.47/webapps/petclinic 2016年10月27日下午12:14:36 org。阿帕奇。卡塔琳娜。果心标准上下文起始内部 严重:ServletContainerInitializer处理javax时出错。servlet。Servle

  • 尝试通过Intellij IEDA运行Appium服务器时发生以下错误: 错误:无法启动应用程序会话,错误是:错误:命令失败:C:\WINDOWS\system32\cmd。exe/s/c“c:\Android\sdk\platform tools\adb.exe-s emulator-5554安装”c:\Program Files(x86)\Appium\node\u modules\Appiu

  • 问题内容: 我正在寻找一种从Matlab中启动应用程序的方法。问题是,我的Matlab脚本将一些结果保存到文件中,然后应在关联的应用程序中打开(在这种情况下为Blender)。 我熟悉类似的命令 要么 以及其他一些方法,但实际上,该应用程序是从Matlab PATH启动的,因此它在Matlab目录中查找所需的各种库。例如: 是否有某种方法可以启动使用全局(系统)PATH的应用程序? 不久前,我以为

  • 报告如下: 我没有运行任何其他Postgres安装。通过运行以下命令确认了这一点: 端口5432上也没有运行的应用程序。通过跑步证实了这一点 有什么想法吗?