Spring Boot 2 基础案例篇
包含:入门、日志管理、定时器、事务、AOP、数据库、缓存、NoSQL、监控、打包。
Spring Boot 2 高级案例篇
包含:整合常用中间件:分库分表、权限管理、Redis 集群、Dubbo、消息队列、定时器、搜索引擎、文件管理、邮件等
按照指定时间执行的程序。
数据分析数据清理系统服务监控
同步调用程序按照代码顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用顺序执行时,不等待异步调用的代码块返回结果就执行后面的程序。
短信通知邮件发送批量数据入缓存
@Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行@Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行@Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次@Scheduled(cron="/5") :通过cron表达式定义规则
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;import java.util.Date;/** * 时间定时任务 */@Componentpublic class TimeTask { Logger LOG = LoggerFactory.getLogger(TimeTask.class.getName()) ; private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ; /** * 每3秒打印一次系统时间 */ @Scheduled(fixedDelay = 3000) public void systemDate (){ LOG.info("当前时间::::"+format.format(new Date())); }}
@EnableScheduling // 启用定时任务@SpringBootApplicationpublic class TaskApplication { public static void main(String[] args) { SpringApplication.run(TaskApplication.class,args) ; }}
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Component;@Componentpublic class AsyncTask { private static final Logger LOGGER = LoggerFactory.getLogger(AsyncTask.class) ; /* * [ asyncTask1-2] com.boot.task.config.AsyncTask : ======异步任务结束1====== * [ asyncTask1-1] com.boot.task.config.AsyncTask : ======异步任务结束0====== */ // 只配置了一个 asyncExecutor1 不指定也会默认使用 @Async public void asyncTask0 () { try{ Thread.sleep(5000); }catch (Exception e){ e.printStackTrace(); } LOGGER.info("======异步任务结束0======"); } @Async("asyncExecutor1") public void asyncTask1 () { try{ Thread.sleep(5000); }catch (Exception e){ e.printStackTrace(); } LOGGER.info("======异步任务结束1======"); }}
这里可以不指定,指定执行的线城池,可以更加方便的监控和管理异步任务的执行。
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;import java.util.concurrent.ThreadPoolExecutor;/** * 定义异步任务执行的线程池 */@Configurationpublic class TaskPoolConfig { @Bean("asyncExecutor1") public Executor taskExecutor1 () { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 核心线程数10:线程池创建时候初始化的线程数 executor.setCorePoolSize(10); // 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程 executor.setMaxPoolSize(20); // 缓冲队列200:用来缓冲执行任务的队列 executor.setQueueCapacity(200); // 允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁 executor.setKeepAliveSeconds(60); // 线程池名的前缀:设置好了之后可以方便定位处理任务所在的线程池 executor.setThreadNamePrefix("asyncTask1-"); /* 线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略, 当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务; 如果执行程序已关闭,则会丢弃该任务 */ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean executor.setWaitForTasksToCompleteOnShutdown(true); // 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 executor.setAwaitTerminationSeconds(600); return executor; }}
@EnableAsync // 启用异步任务@SpringBootApplicationpublic class TaskApplication { public static void main(String[] args) { SpringApplication.run(TaskApplication.class,args) ; }}
@RestControllerpublic class TaskController { @Resource private AsyncTask asyncTask ; @RequestMapping("/asyncTask") public String asyncTask (){ asyncTask.asyncTask0(); asyncTask.asyncTask1(); return "success" ; }}
在Spring Boot2.0框架下配置数据源和通过JdbcTemplate访问数据库的案例。
SpringBoot对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
1)execute方法:可以用于执行任何SQL语句;2)update方法batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;3)query方法及queryFor方法:用于执行查询相关语句;4)call方法:用于执行存储过程、函数相关语句。
mysql mysql-connector-java 5.1.21 org.springframework.boot spring-boot-starter-jdbc
spring: application: # 应用名称 name: node06-boot-jdbc datasource: # 数据源一:data_one 库 primary: # 2.0开始的版本必须这样配置 jdbc-url: jdbc:mysql://localhost:3306/data_one #url: jdbc:mysql://localhost:3306/data_one username: root password: 123 driver-class-name: com.mysql.jdbc.Driver # 数据源二:data_two 库 secondary: # 2.0开始的版本必须这样配置 jdbc-url: jdbc:mysql://localhost:3306/data_two #url: jdbc:mysql://localhost:3306/data_two username: root password: 123 driver-class-name: com.mysql.jdbc.Driver
1)数据源一的配置@Primary 注解表示该数据源作为默认的主数据库。
/** * 数据源一配置 */@Configurationpublic class DataOneConfig { @Primary // 主数据库 @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource (){ return DataSourceBuilder.create().build() ; } @Bean(name = "primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate ( @Qualifier("primaryDataSource") DataSource dataSource){ return new JdbcTemplate(dataSource); }}
2)数据源二配置
/** * 数据源二配置 */@Configurationpublic class DataTwoConfig { @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @ConfigurationProperties(prefix="spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate( @Qualifier("secondaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); }}
@RestControllerpublic class JdbcController { private static final Logger LOG = LoggerFactory.getLogger(JdbcController.class); // 数据源一 @Autowired @Qualifier("primaryJdbcTemplate") private JdbcTemplate primaryJdbcTemplate ; // 数据源二 @Autowired @Qualifier("secondaryJdbcTemplate") private JdbcTemplate secondaryJdbcTemplate ; /** * 多数据源查询 */ @RequestMapping("/queryData") public String queryData (){ String sql = "SELECT COUNT(1) FROM d_phone" ; Integer countOne = primaryJdbcTemplate.queryForObject(sql,Integer.class) ; Integer countTwo = secondaryJdbcTemplate.queryForObject(sql,Integer.class) ; LOG.info("countOne=="+countOne+";;countTwo=="+countTwo); return "SUCCESS" ; }}
GitHub·地址https://github.com/cicadasmile/spring-boot-baseGitEE·地址https://gitee.com/cicadasmile/spring-boot-base
本文首发于 GitChat,未经授权不得转载,转载需与 GitChat 联系。
阅读全文: http://gitbook.cn/gitchat/activity/5d6e7362a0c48c2d562b1fa0
您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。