如果您希望在 Spring 中启用定时任务功能,则需要在主类上添加 @EnableScheduling
注解。这样 Spring 才会扫描 @Scheduled
注解并执行定时任务。在大多数情况下,只需要在主类上添加 @EnableScheduling
注解即可,不需要在 Service 层或其他类中再次添加。
以下是一个示例,演示如何在 Spring Boot 中启用定时任务功能:
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
是的,您可以在Service层中实现计划扫描和邮件发送的操作,这是更常见的一种实现方式。 @Slf4j 注解可以方便地为类生成 Logger 对象。
您可以将下面的代码添加到 DailyInspectPlanServiceImpl 类中:```java
@Slf4j
@Service
public class DailyInspectPlanServiceImpl implements DailyInspectPlanService {
@Resource
private DailyInspectPlanMapper dailyInspectPlanMapper;
@Resource
private JavaMailSender javaMailSender;
@Override
public void scanPlan() {
// 获取到达计划时间的记录
List planList = dailyInspectPlanMapper.getPlanListByTime(LocalDateTime.now());
if (planList != null && !planList.isEmpty()) {
// 遍历记录,发送邮件给指定人
for (DailyInspectPlan plan : planList) {
MimeMessage message = javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(new InternetAddress("[email protected]", "发件人姓名"));
helper.setTo(plan.getEmail());
helper.setSubject("日常检查计划提醒");
helper.setText("您有一条日常检查计划的执行时间已经到达,请尽快完成检查任务。");
javaMailSender.send(message);
log.info("邮件已发送至:" + plan.getEmail());
} catch (MessagingException | UnsupportedEncodingException e) {
log.error("发送邮件失败:" + e.getMessage());
}
}
}
}
}
```
在上面的代码中,`scanPlan` 方法通过 `dailyInspectPlanMapper` 获取到达计划时间的记录,遍历记录,使用 `JavaMailSender` 发送邮件给指定人。
这里使用了 `@Slf4j` 注解生成了 Logger 对象,通过 `log` 对象输出日志信息。另外,为了能够发送邮件,您需要在 Spring 中配置邮件发送相关的参数,例如信任的 SMTP 服务器地址、用户名、密码等。
对于定时任务,您可以使用 Spring 的定时任务功能。在 Spring Boot 中,可以通过 `@Scheduled` 注解轻松地实现定时任务。您可以在 `DailyInspectPlanServiceImpl` 类中添加如下代码:
```java
@Scheduled(cron = "0 0 8 * * ?") // 每天上午 8 点执行
public void scheduleScanPlan() {
scanPlan();
}
```
在上面的代码中,`scheduleScanPlan` 方法使用 `@Scheduled` 注解,设置了每天上午 8 点执行一次 `scanPlan` 方法。您可以根据自己的需要调整定时任务的执行时间。
需要注意的是,使用定时任务时,需要将 `@@Scheduled` 注解移到接口上,而不是实现类上,否则定时任务将无法生效。
在 Spring 中使用 @Scheduled
注解时,@Service
注解通常建议放在实现类上,而不是接口上。
这是因为 @Service
注解是用来标识具体的服务实现类的,因此更应该放在实现类上。而将 @Scheduled
注解放在接口里定义的方法上,则可以让实现类根据需求自定义定时任务方法的具体逻辑实现,同时也能保证接口定义的一致性。
以下是一个更加标准的示例:
public interface DailyInspectPlanService {
@Scheduled(cron = "0 0 8 * * ?")
void scanPlan();
}
@Service
public class DailyInspectPlanServiceImpl implements DailyInspectPlanService {
@Override
public void scanPlan() {
// 实现逻辑
}
}
在上面的示例中,我们只在实现类 DailyInspectPlanServiceImpl
上使用了 @Service
注解,而将 @Scheduled
注解放在接口 DailyInspectPlanService
中定义的方法 scanPlan()
上。这样,当使用 Spring 进行扫描时,可以扫描到 DailyInspectPlanServiceImpl
类,并触发 scanPlan()
方法的定时任务。