springboot定时任务

如果您希望在 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() 方法的定时任务。

你可能感兴趣的:(spring,boot,spring,java)