如何让 JobRunr 在 Spring 控制器/服务中检测我计划的后台作业?

Posted

技术标签:

【中文标题】如何让 JobRunr 在 Spring 控制器/服务中检测我计划的后台作业?【英文标题】:How do I get JobRunr to detect my scheduled background job in a Spring controller/service? 【发布时间】:2021-04-27 15:54:28 【问题描述】:

我一直在研究使用 JobRunr 在我的 Spring MVC 应用程序上启动后台作业,因为我真的很喜欢它的简单性以及将它集成到 IoC 容器中的便利性。

我正在尝试创建一个简单的测试计划作业,该作业每分钟将一行文本写入我配置的记录器,但我正在努力弄清楚如何让 JobRunr 后台作业服务器检测它并将其排队。我没有使用 Spring Boot,所以我只是使用通用的 jobrunr Maven 工件而不是“Spring Boot Starter”。我的设置如下:

pom.xml

        <dependency>
            <groupId>org.jobrunr</groupId>
            <artifactId>jobrunr</artifactId>
            <version>2.0.0</version>
        </dependency>

ApplicationConfig.java

    @Bean
    public JobMapper jobMapper() 
        return new JobMapper(new JacksonJsonMapper());
    

    @Bean
    @DependsOn("jobMapper")
    public StorageProvider storageProvider(JobMapper jobMapper) 
        InMemoryStorageProvider storageProvider = new InMemoryStorageProvider();
        storageProvider.setJobMapper(jobMapper);
        return storageProvider;
    

    @Bean
    @DependsOn("storageProvider")
    public JobScheduler jobScheduler(StorageProvider storageProvider, ApplicationContext applicationContext) 
        return JobRunr.configure().useStorageProvider(storageProvider)
                                                       .useJobActivator(applicationContext::getBean)
                                                       .useDefaultBackgroundJobServer()
                                                       .useDashboard()
                                                       .useJmxExtensions()
                                                       .initialize();
    

BackgroundJobsController.java

@Controller
public class BackgroundJobsController 
    private final Logger logger = LoggerFactory.getLogger(getClass());
    private @Autowired JobScheduler jobScheduler;

    @Job(name = "Test")
    public void executeJob() 
        BackgroundJob.scheduleRecurrently(Cron.minutely(), () -> logger.debug("It works!"));
        jobScheduler.scheduleRecurrently(Cron.minutely(), () -> logger.debug("It works too!"));
    

如您所见,我尝试了两种在executeJob 方法中启动后台作业的方法。问题基本上是让 Jobrunr 检测作业 - 它只是在应用程序启动时以某种方式触发 executeJob 方法的情况吗?如果是这样,有人知道最简单的方法吗?以前我使用 Spring @Scheduled 注释在应用程序启动时自动运行 Service/Controller 类中的方法,所以我希望有一种简单的方法可以让 Jobrunr 获取我正在尝试创建的计划任务.抱歉,如果我忽略了一些愚蠢的事情。我花了好几个小时尝试不同的事情并阅读文档!

提前致谢!

【问题讨论】:

【参考方案1】:

您是否尝试过使用 @PostConstruct 注释您的 executeJob 方法?这样,在您的应用程序初始化时,作业将被注册到 JobServer。

我相信@Job 注释是为了工作本身的方法。 (在你的情况下是调试方法)。

【讨论】:

嗨,Ben,我刚刚回到这部分工作,之前并不知道@PostConstruct 注释。这正是我所缺少的 - 非常感谢!【参考方案2】:

这样做有不同的方法:

这是一个,用@PostConstruct注释一个方法确实是另一个。

@SpringBootApplication
@Import(JobRunrExampleConfiguration.class)
public class JobRunrApplication 

    public static void main(String[] args) 
        ConfigurableApplicationContext applicationContext = SpringApplication.run(JobRunrApplication.class, args);

        JobScheduler jobScheduler = applicationContext.getBean(JobScheduler.class);
        jobScheduler.<SampleJobService>scheduleRecurrently("recurring-sample-job", every5minutes(), x -> x.executeSampleJob("Hello from recurring job"));
    

您可以在此处查看示例:https://github.com/jobrunr/example-java-mag/blob/main/src/main/java/org/jobrunr/examples/JobRunrApplication.java

【讨论】:

谢谢罗纳德。 Ben 和您使用 @PostConstruct 注释的答案正是我想要的。正如本首先回答的那样,我选择了他的答案作为“正确”的答案。作为图书馆的作者,我非常感谢您抽出时间来回答我的问题。首先感谢您创建图书馆!

以上是关于如何让 JobRunr 在 Spring 控制器/服务中检测我计划的后台作业?的主要内容,如果未能解决你的问题,请参考以下文章

如何让Spring MVC接收的参数可以转换为java对象

让 Spring Boot 颜色控制台日志记录在 Intellij 中工作?

如何在struts2+ spring+ ibatis 框架中配置log4j让控制台显示sql语句

如何让 Spring MVC 读取日期为“2019-3-29”格式的路径参数?

如何使用 Spring Boot 流式传输音频

Spring-boot - 如何同时使用 Resteasy JAX-RS 和 Spring MVC 控制器