使用到的类是java.util.concurrent包下的ScheduledThreadPoolExecutor类,该类继承ThreadPoolExecutor并实现ScheduledExecutorService接口。完整的代码如下:
1、springboot主类:
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import com.wocloud.arch.ssm.Executor.TaskDisableUser;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author mazhen
* Run as此类,则启动项目成功 extends SpringBootServletInitializer
*/
@EnableAutoConfiguration(exclude ={DruidDataSourceAutoConfigure.class,DataSourceAutoConfiguration.class})
@EnableTransactionManagement(order = 10)
@SpringBootApplication //spring boot自带的注解具有扫描主类所在的包的子包的bean的功能。
public class WoCloudApplication {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
SpringApplication.run(WoCloudApplication.class, args);
//用户到期后禁用
disableUser();
}
private static void disableUser () {
ScheduledExecutorService scheduledThreadPool = new ScheduledThreadPoolExecutor(1);
TaskDisableUser worker = new TaskDisableUser("用户到期后禁用");
scheduledThreadPool.scheduleAtFixedRate(worker,5,20, TimeUnit.SECONDS);
}
}
2、线程类:
import com.wocloud.arch.ssm.model.SysUser;
import com.wocloud.arch.ssm.service.SysUserService;
import com.wocloud.arch.ssm.utils.common.RandomTool;
import com.wocloud.arch.ssm.utils.executor.ExecutorUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author mazhen
*/
public class TaskDisableUser implements Runnable {
private final static Logger LOGGER = LoggerFactory.getLogger(TaskDisableUser.class);
private String name;
public TaskDisableUser (String name) {
this.name = name;
}
@Override
public void run () {
LOGGER.info("处理过期用户,startTime="+ new Date());
List<SysUser> sysUsers = ExecutorUtils.selectExpireUser();
try {
if (null != sysUsers && sysUsers.size() > 0) {
List<String> codes = new ArrayList<>();
for (SysUser sysUser : sysUsers) {
codes.add(sysUser.getUserCode());
}
Map<String,Object> map = new HashMap<>();
map.put("status",1);
map.put("codes",codes);
ExecutorUtils.lockUserByCode(map);
}
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("异常信息:"+e.getMessage());
}
LOGGER.info("处理过期用户,endTime="+ new Date());
}
}
3、sysUserService注入到线程类失败的解决方案是新建下面的类:
import com.wocloud.arch.ssm.model.SysUser;
import com.wocloud.arch.ssm.service.SysUserService;
import com.wocloud.arch.ssm.utils.SpringContextUtil;
import java.util.List;
import java.util.Map;
/** 解决
* @author mazhen
*/
public class ExecutorUtils {
private static SysUserService sysUserService;
static {
sysUserService = (SysUserService)SpringContextUtil.getBean("sysUserService");
}
public static List<SysUser> selectExpireUser () {
return sysUserService.selectExpireUser();
}
public static void lockUserByCode (Map<String,Object> map) {
sysUserService.lockUserByCode(map);
}
}
参考文章:https://blog.csdn.net/chang_ge/article/details/80080382