因项目需要,必须在后台服务启动后,立即启动一个线程持续进行REDIS数据库扫描,频率大概每20分钟一次,扫描后进行一定的操作。以下为启动服务器后启动线程的方法之一:
/**
* 服务启动初始化方法控制器
* @author Administrator
*
*/
@Controller
public class InitController {
@Autowired
InitService initService;
@PostConstruct
public void redisDetection() {
System.out.println("已启动redis扫描");
initService.redisDetection();
}
}
之后在相应的InitService.java文件中进行处理,一开始另写了一个类继承Thread进行线程设置,但是后来发现这个类无法进行依赖注入(@Autowired无效),所自动注入的DAO层文件均为空,且报java.lang.NullPointerExceptionthread错误。
经过查询,Spring不支持在自己写的线程里进行自动注入,这是为了保证整个项目的线程安全,因此我们可以在InitService类里创建一个处理线程的内部类,将InitService类里注入的bean传递给这个线程类进行调用,可以解决以上问题。
@Service
public class InitService {
@Autowired
XXXMapper xxxMapper;
/**
* 启动缓存过期检测线程
*/
public void redisDetection() {
// TODO Auto-generated method stub
RedisDetection redisDetection = new RedisDetection(xxxMapper);
redisDetection.start();
System.out.println("Redis扫描线程启动成功");
}
/**
* redis监控线程内部类,必须通过内部类才可以调用自动注入的bean
* @author Administrator
*
*/
public class RedisDetection extends Thread {
private XXXMapper xxxMapper;
public RedisDetection(XXXMapper xxxMapper) {
this.xxxMapper = xxxMapper;
}
@Override
public void run() {
while(true) {
try {
//每20分钟扫描一次
sleep(20*60*1000);
具体操作(xxxMapper);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
}