Spring Boot 启动
-
运行启动类的main方法
-
mvn spring-boot:run
-
java -jar x.jar
Spring Boot 不同环境配置
对于日常使用来说,免不了有开发、测试、生产等各种环境,如果重复修改同一个文件会显得很麻烦,解决:
1.根据不同的环境配置不同的文件:
2.在application.yml文件中如下定义:
spring:
profiles:
active: dev
3.启动方式
spring-boot:run -Drun.profiles=prod
java -jar xx.jar --spring.profiles.active=prod
- idea中启动项目配置里可以修改,这里不赘述
Spring Boot Runner启动器
在项目刚运行的时候,如果你想完成一些初始化工作,你可以实现接口 ApplicationRunner
public interface ApplicationRunner {
void run(ApplicationArguments args) throws Exception;
}
或者 CommandLineRunner
,这两个接口实现方式一样,它们都只提供了一个run方法。
public interface CommandLineRunner {
void run(String... args) throws Exception;
}
简单使用:
@Component
public class SystemInit implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
}
}
如果你需要初始化的有很多,而他们又有一定的执行顺序,不妨添加@Order,此注释包含一个属性“value”,它接受像1,2等整数值,最低值具有更高的优先级。
@Component
@Order(value = 1)
public class SystemInit implements CommandLineRunner {
private final static Logger logger = LoggerFactory.getLogger(PocaoApplication.class);
@Override
public void run(String... args) throws Exception {
logger.info("=================init1===================");
}
}
@Component
@Order(value = 2)
public class SystemInit2 implements CommandLineRunner {
private final static Logger logger = LoggerFactory.getLogger(PocaoApplication.class);
@Override
public void run(String... args) throws Exception {
logger.info("=================init2===================");
}
}
Spring Boot 中定时任务的简单运用
- 在启动类上加上@EnableScheduling,开启定时任务
- 在需要作为定时任务的方法上加上@Scheduled
@Component
public class Task {
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static final Logger logger = LoggerFactory.getLogger(Task.class);
@Scheduled(fixedRate = 10000)
public void reportCurrentTime(){
logger.info("现在时间:{}",sdf.format(new Date()));
}
}
2018-10-27 17:03:34.490 INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:03:34
2018-10-27 17:03:44.490 INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:03:44
2018-10-27 17:03:54.491 INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:03:54
2018-10-27 17:04:04.491 INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:04:04
2018-10-27 17:04:14.491 INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:04:14
2018-10-27 17:04:24.492 INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:04:24
2018-10-27 17:04:34.491 INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:04:34
2018-10-27 17:04:44.492 INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:04:44
2018-10-27 17:04:54.491 INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:04:54
- 定时任务可以使用cron表达式
- 需要注意的是:cron表达式只支持6位 如果你这样写:
@Scheduled(cron = "10-13 * * * * ? *") 会报这样的一个错误: Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'reportCurrentTime': Cron expression must consist of 6 fields (found 7 in "10-13 * * * * ? *") 最后一位往往指的是年,所以可以忽略
@Scheduled(cron = "10-13 * * * * ?")
public void reportCurrentTime(){
logger.info("现在时间:{}",sdf.format(new Date()));
}
2018-10-27 17:16:10.001 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:16:10
2018-10-27 17:16:11.001 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:16:11
2018-10-27 17:16:12.001 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:16:12
2018-10-27 17:16:13.001 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:16:13
2018-10-27 17:17:10.003 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:17:10
2018-10-27 17:17:11.001 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:17:11
2018-10-27 17:17:12.001 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:17:12
2018-10-27 17:17:13.001 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:17:13
2018-10-27 17:18:10.002 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:18:10
2018-10-27 17:18:11.001 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:18:11
2018-10-27 17:18:12.001 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:18:12
2018-10-27 17:18:13.001 INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task : 现在时间:2018-10-27 17:18:13
Spring Boot 异步任务的简单运用
- 在启动类上加上@EnableAsync,开启定时任务
- 在需要作为异步任务的方法上加上@Async
@Component
public class AsyncTask {
private final static Logger logger = LoggerFactory.getLogger(AsyncTask.class);
@Async
public Future<Boolean> doTask1() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(1000);
long end = System.currentTimeMillis();
logger.info("任务1耗时:{}毫秒",end - start);
return new AsyncResult<>(true);
}
@Async
public Future<Boolean> doTask2() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(700);
long end = System.currentTimeMillis();
logger.info("任务1耗时:{}毫秒",end - start);
return new AsyncResult<>(true);
}
@Async
public Future<Boolean> doTask3() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(600);
long end = System.currentTimeMillis();
logger.info("任务1耗时:{}毫秒",end - start);
return new AsyncResult<>(true);
}
}
测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
public class AsyncTaskTest {
@Autowired
private AsyncTask asyncTask;
private final static Logger logger = LoggerFactory.getLogger(AsyncTaskTest.class);
@Test
public void test() throws Exception {
long start = System.currentTimeMillis();
Future<Boolean> a = asyncTask.doTask1();
Future<Boolean> b = asyncTask.doTask2();
Future<Boolean> c = asyncTask.doTask3();
while (!a.isDone() || !b.isDone() || !c.isDone()) {
if (a.isDone() && b.isDone() && c.isDone()) {
break;
}
}
long end = System.currentTimeMillis();
logger.info("任务全部完成,总耗时{}毫秒",end - start);
}
}
结果:
2018-10-29 09:11:59.596 INFO 6896 --- [cTaskExecutor-3] com.brilliant.pocao.tasks.AsyncTask : 任务1耗时:600毫秒
2018-10-29 09:11:59.687 INFO 6896 --- [cTaskExecutor-2] com.brilliant.pocao.tasks.AsyncTask : 任务1耗时:700毫秒
2018-10-29 09:12:00.009 INFO 6896 --- [cTaskExecutor-1] com.brilliant.pocao.tasks.AsyncTask : 任务1耗时:1021毫秒
2018-10-29 09:12:00.010 INFO 6896 --- [ main] com.brilliant.pocao.tasks.AsyncTaskTest : 任务全部完成,总耗时1065毫秒
运用场景:发送短信、发送邮件等消息推送
Spring Boot 个人踩坑
- 初始创建项目后,直接运行看看,结果就报了datasource的错误,查阅发现项目启动会自动装载这个类,而我又没有配置数据库的相关信息,处理结果就是先忽略掉这个类,等配置好数据库后再删掉就行了。。。
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
-------------------持续更新中------------------------