springboot整合QuartZ邮件文件上传JPA

springboot整合QuartZ邮件文件上传JPA

一. 定时任务

定时任务就是指定时执行某一个流程方法。在Java中有很多种方式去实现它,如果只需要简单的方式可以采用SpringTask,如果需要分布式那么可以使用QuartZ。

1.1 集成SpringTask

集成SpringTask无需导入任何其他第三方库

第一步:编写对应的任务类A

@Component
public class MyTask1 {
    @Scheduled(cron = "*/6 * * * * ?")
    public void doTask(){
        System.out.println("MyTask1===" + Thread.currentThread().getName()
                + "时间:" + new Date());
    }
}


@Component
public class MyTask2 {
    @Scheduled(fixedRate = 2000)
    public void doTask(){
        System.out.println("MyTask2===" + Thread.currentThread().getName()
                + "时间:" + new Date());
    }
}

第二步:添加配置

@EnableScheduling // 直接在系统配置类上添加即可
@SpringBootApplication
public class Demo11Application {
	public static void main(String[] args) {
		SpringApplication.run(Demo11Application.class, args);
	}
}
cron表达式含义:
corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份(年份可以不写)
字段	允许值	允许的特殊字符
秒(Seconds)	0~59的整数	, - * /    四个字符
分(Minutes)	0~59的整数	, - * /    四个字符
小时(Hours)	0~23的整数	, - * /    四个字符
日期(DayofMonth)	1~31的整数(但是你需要考虑你月的天数)	,- * ? / L W C     八个字符
月份(Month)	1~12的整数或者 JAN-DEC	, - * /    四个字符
星期(DayofWeek)	1~7的整数或者 SUN-SAT (1=SUN)	, - * ? / L C #     八个字符
年(可选,留空)(Year)	1970~2099	, - * /    四个字符
  
  每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:

  (1)*:表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件。

  (2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。

  (3)-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次 

  (4)/:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次. 

  (5),:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。 

  (6)L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。 

  (7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。

  (8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。 

  (9)#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

  三、常用表达式例子
  (1)0 0 2 1 * ? *   表示在每月的1日的凌晨2点调整任务

  (2)0 15 10 ? * MON-FRI   表示周一到周五每天上午10:15执行作业

  (3)0 15 10 ? 6L 2002-2006   表示2002-2006年的每个月的最后一个星期五上午10:15执行作

  (4)0 0 10,14,16 * * ?   每天上午10点,下午2点,4点 

  (5)0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时 

  (6)0 0 12 ? * WED    表示每个星期三中午12点 

  (7)0 0 12 * * ?   每天中午12点触发 

  (8)0 15 10 ? * *    每天上午10:15触发 

  (9)0 15 10 * * ?     每天上午10:15触发 

  (10)0 15 10 * * ? *    每天上午10:15触发 

  (11)0 15 10 * * ? 2005    2005年的每天上午10:15触发 

  (12)0 * 14 * * ?     在每天下午2点到下午2:59期间的每1分钟触发 

  (13)0 0/5 14 * * ?    在每天下午2点到下午2:55期间的每5分钟触发 

  (14)0 0/5 14,18 * * ?     在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 

  (15)0 0-5 14 * * ?    在每天下午2点到下午2:05期间的每1分钟触发 

  (16)0 10,44 14 ? 3 WED    每年三月的星期三的下午2:10和2:44触发 

  (17)0 15 10 ? * MON-FRI    周一至周五的上午10:15触发 

  (18)0 15 10 15 * ?    每月15日上午10:15触发 

  (19)0 15 10 L * ?    每月最后一日的上午10:15触发 

  (20)0 15 10 ? * 6L    每月的最后一个星期五上午10:15触发 

  (21)0 15 10 ? * 6L 2002-2005   2002年至2005年的每月的最后一个星期五上午10:15触发 

  (22)0 15 10 ? * 6#3   每月的第三个星期五上午10:15触发
@Scheduled所支持的参数: 
1. cron:cron表达式,指定任务在特定时间执行; 
2. fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms; 
3. fixedDelayString:与fixedDelay含义一样,只是参数类型变为String; 
4. fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms; 
5. fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String; 
6. initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms; 
7. initialDelayString:与initialDelay的含义一样,只是将参数类型变为String; 
8. zone:时区,默认为当前时区,一般没有用到。

设置SpringTask以多线程的方式运行:(只需要在配置类中添加线程池的对象即可)

@EnableScheduling
@SpringBootApplication
public class Demo11Application {
	@Bean
	public TaskScheduler taskScheduler() {
		ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
		//线程池大小
		scheduler.setPoolSize(10);
		return scheduler;
	}

	public static void main(String[] args) {
		SpringApplication.run(Demo11Application.class, args);
	}
}
1.2 集成quartZ

第一步:导入包

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
</dependency>

第二步:编写代码

任务类:

public class MyJob1 implements Job {
    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        System.out.println("MyJob1====" + Thread.currentThread().getName() +  "时间:"+new Date());
    }
}


public class MyJob2 implements Job {
    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        System.out.println("MyJob2====" + Thread.currentThread().getName() +  "时间:"+new Date());
    }
}

计划类:

@Component
public class JobSchedule {
    // 任务调度
    @Resource
    private Scheduler scheduler;

    // 开始执行所有任务
    public void startJob() throws SchedulerException {
        startJob1(scheduler);
        startJob2(scheduler);
        scheduler.start();
    }

    // 获取Job信息
    public String getJobInfo(String name, String group) throws SchedulerException {
        TriggerKey triggerKey = new TriggerKey(name, group);
        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        return String.format("time:%s,state:%s", cronTrigger.getCronExpression(),
                scheduler.getTriggerState(triggerKey).name());
    }

    // 修改某个任务的执行时间
    public boolean modifyJob(String name, String group, String time) throws SchedulerException {
        Date date = null;
        TriggerKey triggerKey = new TriggerKey(name, group);
        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        String oldTime = cronTrigger.getCronExpression();
        if (!oldTime.equalsIgnoreCase(time)) {
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, group)
                    .withSchedule(cronScheduleBuilder).build();
            date = scheduler.rescheduleJob(triggerKey, trigger);
        }
        return date != null;
    }

    // 暂停所有任务
    public void pauseAllJob() throws SchedulerException {
        scheduler.pauseAll();
    }

    // 暂停某个任务
    public void pauseJob(String name, String group) throws SchedulerException {
        JobKey jobKey = new JobKey(name, group);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.pauseJob(jobKey);
    }

    // 恢复所有任务
    public void resumeAllJob() throws SchedulerException {
        scheduler.resumeAll();
    }

    // 恢复某个任务
    public void resumeJob(String name, String group) throws SchedulerException {
        JobKey jobKey = new JobKey(name, group);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.resumeJob(jobKey);
    }

    // 删除某个任务
    public void deleteJob(String name, String group) throws SchedulerException {
        JobKey jobKey = new JobKey(name, group);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.deleteJob(jobKey);
    }

    private void startJob1(Scheduler scheduler) throws SchedulerException {
        // 创建JobDetail
        JobDetail jobDetail = JobBuilder.newJob(MyJob1.class).withIdentity("job1", "group1").build();
        // 创建表达式构建者
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/2 * * * * ?");
        // 创建触发器
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job1", "group1")
                .withSchedule(cronScheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);
    }

    private void startJob2(Scheduler scheduler) throws SchedulerException {
        JobDetail jobDetail = JobBuilder.newJob(MyJob2.class).withIdentity("job2", "group2").build();
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ?");
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job2", "group2")
                .withSchedule(cronScheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);
    }
}

启动类:

@Controller
@SpringBootApplication
public class Demo11Application {
	@Resource
	private JobSchedule jobSchedule;

	@Bean
	public Scheduler scheduler(){
		try {
			return new StdSchedulerFactory().getScheduler();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return null;
	}

	@ResponseBody
	@RequestMapping("/")
	public String index(){
		try {
			jobSchedule.startJob();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return "Job Started!!";
	}
	public static void main(String[] args) {
		SpringApplication.run(Demo11Application.class, args);
	}
}

二. 集成邮件

第一步:添加邮件需要的包

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

第二步:添加邮件配置

#邮箱发送方协议
spring.mail.host=smtp.1000phone.com
#发送方邮箱
[email protected]
#发送方密码(有些邮箱有授权码,例如QQ邮箱,那么此处不再使用密码,而需要使用授权码)
spring.mail.password=test
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

第三步:编写发送代码

@Component
public class MailService  {
    @Resource
    private JavaMailSender javaMailSender;

    @Value("${spring.mail.username}")
    private String from;

    public void sendMail(String to, String subject, String content){
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(from);
        simpleMailMessage.setTo(to);
        simpleMailMessage.setSubject(subject);
        simpleMailMessage.setText(content);
        
        javaMailSender.send(simpleMailMessage);
    }
}

第四步:测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class Demo21ApplicationTests {
	@Resource
	private MailService mailService;

	@Test
	public void contextLoads() {
		mailService.sendMail("[email protected]", "测试", "测试内容");
	}
}

三. 集成文件上传

第一步:添加配置:

# 上传多个文件总的最大值(默认为1M)
spring.servlet.multipart.max-request-size=10MB
# 单个文件的最大值(默认为1M)
spring.servlet.multipart.max-file-size=10MB

第二步:编写代码:

四. 集成JPA

第一步:导入包

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

第二步:编写代码

// 继承CrudRepository
public interface StudentDAO  extends CrudRepository<Student, Integer>{
}

// 继承PagingAndSortingRepository
public interface StudentDAO  extends PagingAndSortingRepository<Student, Integer>{
}

// 继承JpaRepository
public interface StudentDAO  extends JpaRepository<Student, Integer>{
}

具体代码地址

猜你喜欢

转载自blog.csdn.net/weixin_39034379/article/details/85231044