坑1:spring的定时任务:@Scheduled
spring的定时任务默认是单线程,多个任务执行起来时间会有问题:B任务会因为A任务执行起来需要20S而被延后20S执行,需要增加定时任务配置,配置定时任务连接池大小。
SSM配置(网上看的,未测试):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
classpath:/org/springframework/beans/factory/xml/spring-beans-4.1.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.1.xsd">
<!-- 注解式 -->
<task:annotation-driven executor="taskExecutor" proxy-target-class="true" scheduler="scheduler" />
<!-- 配置处理定时任务的线程池 -->
<task:scheduler id="myScheduler" pool-size="5" />
<!-- 配置处理 异步定时任务的 线程池 -->
<beans:bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 核心线程数 -->
<beans:property name="corePoolSize" value="5" />
<!-- 最大线程数 -->
<beans:property name="maxPoolSize" value="10" />
<!-- 队列最大长度 -->
<beans:property name="queueCapacity" value="25" />
<!-- 线程池维护线程所允许的空闲时间,默认为60s -->
<beans:property name="keepAliveSeconds" value="300" />
<!-- 线程池对拒绝任务(无线程可用)的处理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃. -->
<beans:property name="rejectedExecutionHandler">
<beans:bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
</beans:property>
</beans:bean>
</beans>
springboot配置:
@Configuration
public class ScheduleConfig implements SchedulingConfigurer{
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
//参数传入一个size为5的线程池
scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
}
}
坑2:工具类中使用@Autowired注入
一个类,类中所有的方法都是static的,当在此类注入时应改变注入方式,否则注入的对象为null
@Autowired
private RTDServiceMapper rtdService;
private static RTDServiceMapper rtdServiceMapper;
@PostConstruct
public void init() {
rtdServiceMapper = rtdService;//赋值
}