如何让 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 Boot 颜色控制台日志记录在 Intellij 中工作?
如何在struts2+ spring+ ibatis 框架中配置log4j让控制台显示sql语句