Micronaut 是一种先进的 Java框架,用于构建轻量级、模块化、易于测试和部署的微服务应用程序。它被设计为快速、低内存消耗的框架,支持多种编程语言和云平台。Micronaut提供了依赖注入、面向切面编程、声明式HTTP客户端和服务器、支持开箱即用的应用程序监视和管理、容器化和部署等功能。它使用了许多现代的技术,如反应式编程、响应式HTTP和非堵塞I/O等,使得开发者可以更加高效的构建现代化的微服务应用程序。
类似于 Spring Boot 框架,Micronaut 中很多特性也类似于 Spring Boot。
在 Micronaut 中,如果我们要设置一个定时任务,类似 Spring Boot 一样,我们可以直接使用注解,如下:
@Singleton
public class HelloWorldJob {
private static final Logger LOG = LoggerFactory.getLogger(HelloWorldJob.class);
@Scheduled(fixedDelay = "10s")
void executeEveryTen() {
LOG.info("Simple Job every 10 seconds: {}", new SimpleDateFormat("dd/M/yyyy hh:mm:ss").format(new Date()));
}
@Scheduled(fixedDelay = "45s", initialDelay = "5s")
void executeEveryFourtyFive() {
LOG.info("Simple Job every 45 seconds: {}", new SimpleDateFormat("dd/M/yyyy hh:mm:ss").format(new Date()));
}
}
通过注解的形式,可以解决 90% 的定时任务情况,但有些定时任务需要实时生成,即需要通过代码设置。这种情况下注解就无法解决了,需要我们自己在业务中用代码定义定时任务。
我们需要先定义一个实现 Runnable 的定时任务,在任务中声明定时任务要实现的逻辑,示例代码如下:
public class EmailTask implements Runnable {
private String email;
private String message;
private EmailUseCase emailUseCase;
public EmailTask(EmailUseCase emailUseCase, String email, String message) {
this.email = email;
this.message = message;
this.emailUseCase = emailUseCase;
}
@Override
public void run() {
emailUseCase.send(email, message);
}
}
然后在创建定时任务的逻辑中设置定时,示例代码如下:
@Singleton
public class RegisterUseCase {
private static final Logger LOG = LoggerFactory.getLogger(RegisterUseCase.class);
protected final TaskScheduler taskScheduler;
protected final EmailUseCase emailUseCase;
public RegisterUseCase(EmailUseCase emailUseCase,
@Named(TaskExecutors.SCHEDULED) TaskScheduler taskScheduler) {
this.emailUseCase = emailUseCase;
this.taskScheduler = taskScheduler;
}
public void register(String email) {
LOG.info("saving {} at {}", email, new SimpleDateFormat("dd/M/yyyy hh:mm:ss").format(new Date()));
scheduleFollowupEmail(email, "Welcome to the Micronaut framework");
}
private void scheduleFollowupEmail(String email, String message) {
EmailTask task = new EmailTask(emailUseCase, email, message);
taskScheduler.schedule(Duration.ofMinutes(1), task);
}
}
在以上代码中,我们可以看到,定时任务的实例为 TaskScheduler taskScheduler,通过它就可以手动定义定时任务。