SpringBoot高级——任务

一、异步任务
 1、主启动类开启使用异步功能:@EnableAsync

@EnableAsync
@SpringBootApplication
public class SpringbootTaskApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTaskApplication.class, args);
    }

}

 2、异步执行的方法上标注 @Async

@Service
public class AsyncService {
    @Async
    public void asyncMethod() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("执行中...");
    }
}

 原理:SpringBoot会为标注了@Async注解的方法开启新的线程,一定要注意加@Async注解的方法所在的类一定是交给Spring容器管理的

二、定时任务
 1、主启动类使用@EnableScheduling注解开启定时任务功能

@EnableScheduling
@SpringBootApplication
public class SpringbootTaskApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTaskApplication.class, args);
    }

}

 2、定时任务方法加@Scheduled注解,并配置CRON表达式

@Service
public class ScheduleService {

    @Scheduled(cron = "0/3 * * * * 0-6")
    public void scheduleMethod() {
        System.out.println("hello");
    }
}

 3、CRON表达式详解
  ①cron表达式共六位:每个位置代表的时间单位依次为秒、分、时、日期、月份、星期
在这里插入图片描述
  ②可以使用的特殊字符:
在这里插入图片描述
  ③示例:
   0 0/5 14,18 * * ?:每天14点整,和18点整开始,每隔5分钟执行一次,即14点开始每5分钟执行一次,执行到15点整停止,然后到18点整继续每5分钟执行一次至19点停止
   0 15 10 ? * 1-6:每个月的周一至周六10:15分执行一次
   0 0 2 ? * 6L:每个月的最后一个周六凌晨2点执行一次
   0 0 2 LW * ?:每个月的最后一个工作日凌晨2点执行一次
   0 0 2-4 ? * 1#1:每个月的第一个周一凌晨2点到4点期间,每个整点都执行一次,即2点执行一次、3点执行一次、4点执行一次
  ④说明:
   1️⃣当日期和星期冲突的时候不能再使用*,而改用?,使用?的位置服从于写了具体时间的位置
   2️⃣SpringBoot中的cron表达式的星期和Quratz中稍有不同:在SpringBoot中数字0和7都表示周日,其他的1-6一次表示周1至周6,而Quratz的cron表达式中只有1-6,且1表示周日,2表示周一,依次类推

三、邮件任务
在这里插入图片描述
 邮件发送流程:
  ①邮件发送方通过用户名密码登录自己的邮箱服务器(此处是直接调用接口的方式登录)
  ②发送方准备好要发送的邮件
  ③将邮件从邮件发送发的邮箱服务器发送至接收方的邮件服务器
  ④接收方在登录自己的邮箱后从邮箱服务器将邮件拉取过来进行查看
  因此需要配置邮件发送方的用户名、密码和邮箱服务器地址
 1、引入starter依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

 2、自动配置类MailSenderAutoConfiguration,MailSenderAutoConfiguration导入了MailSenderJndiConfiguration,MailSenderJndiConfiguration中向容器中加入了JavaMailSenderImpl,JavaMailSenderImpl是用来发送邮件的(低版本的SpringBoot中JavaMailSenderImpl是在MailSenderAutoConfiguration中加入容器的)
 3、发送邮件的属性可以通过MailProperties来设置:对应的属性前缀为spring.mail

@ConfigurationProperties(
    prefix = "spring.mail"
)
public class MailProperties {
    private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
    private String host;
    private Integer port;
    private String username;
    private String password;
    private String protocol = "smtp";
    private Charset defaultEncoding;
    private Map<String, String> properties;
    private String jndiName;
    private boolean testConnection;

    public MailProperties() {
        this.defaultEncoding = DEFAULT_CHARSET;
        this.properties = new HashMap();
    }
    
    //...
}

 4、配置邮箱属性:

spring.mail.username=xxx@qq.com
spring.mail.password=****
spring.mail.host=smtp.qq.com

 注意:
  1️⃣这里的密码并不是在网页上登录使用的密码,而是在邮箱的设置-账户中开通服务时获取到的授权码,点击已发送后会看到授权码,该授权码即为此处填写的密码
在这里插入图片描述
  2️⃣host地址的值也是在设置中开启邮箱服务之后通过点击进去看到的:同样的邮箱通常是一样的,表示邮箱服务器的地址
注意:在使用QQ邮箱发送邮件的时候,仅仅配置上面3个属性有可能还不行,会提示需要一个安全的连接,此时需要进行如下配置:

spring.mail.properties.mail.smtp.ssl.enable=true

 5、测试发送简单邮件:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTaskApplicationTests {

    @Autowired
    JavaMailSenderImpl javaMailSender;

    @Test
    public void contextLoads() {
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setSubject("今晚开会");//主题
        mailMessage.setText("今晚7点开会");//内容
        mailMessage.setTo("***@foxmail.com");
        mailMessage.setFrom("***@qq.com");
        javaMailSender.send(mailMessage);
    }
}

  将JavaMailSenderImpl 自动注入,并使用其发送邮件;通过SimpleMailMessage 来构建邮件的内容
 6、测试发送复杂邮件:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTaskApplicationTests {

    @Autowired
    JavaMailSenderImpl javaMailSender;

    @Test
    public void test() throws Exception {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        //true表示可上传附件
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
        mimeMessageHelper.setSubject("今晚开会");
        //true表示这是一段html代码
        mimeMessageHelper.setText("<b style='color:red'>今晚7点开会</b>", true);//可设置成html代码,展示的更好看
        mimeMessageHelper.setTo("***@foxmail.com");
        mimeMessageHelper.setFrom("***@qq.com");

        //添加附件文件
        mimeMessageHelper.addAttachment("1.jpg", new File("H:\\照片\\1.png"));
        mimeMessageHelper.addAttachment("1.jpg", new File("H:\\照片\\2.png"));
        javaMailSender.send(mimeMessage);
    }
}

 收件人可以设置多个,也可以设置抄送等;邮件接收者在登录邮箱时就可以看到发送的邮件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值