问题代码:
@Component
public class MsgUpdateTask {
private final Log LOG = LogFactory.getLog(this.getClass());
@Resource
@Qualifier("jedis")
private JedisCommands jedisCommands;
@Resource
@Qualifier("httpClient")
private HttpClient httpClient;
@Resource
@Qualifier("quickThreadPoolTask")
private ThreadPoolTaskExecutor quickSmsTaskExecutor;
@Resource
@Qualifier("slowThreadPoolTask")
private ThreadPoolTaskExecutor slowSmsTaskExecutor;
@Resource
@Qualifier("failUpdateThreadPoolTask")
private ThreadPoolTaskExecutor failUpdateThreadPoolTask;
@Resource
private EmailCreate emailCreate;
@Resource
private SmsProperty smsProperty;
static ApplicationContext context;
private Thread productor;
@Value("${im.emailSendSlowThreadPoolSize}")
private int poolSize;
@Resource
private MdlDataService dataService;
static {
context = new ClassPathXmlApplicationContext("applicationContext.xml");
}
// redis数据读取一次读取数据条数
@Value("${im.update.redisDataReadSize}")
private int redisDataReadSize;
// redis数据读取无限执行等待时间(毫秒)
@Value("${im.msgSend.redisDataReadWaitInMillis}")
private int redisDataReadWaitInMillis;
// redis数据读取,无数据时的间隔时间(秒)
@Value("${im.msgSend.redisDataReadIntervalSeconds}")
private int redisDataReadIntervalSeconds;
public MsgUpdateTask() {
init(); //构造方法调用初始化方法
}
private void init() {
productor = new Thread() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
// 邮件(快) 这个方法里面调用成员变量,启动的时候注入的成员对象为null
boolean hasRedisDataFailed = send(ImConstant.REDIS_QUEUE_SEND_FAILED, failUpdateThreadPoolTask, redisDataReadSize);
// 获取redis数据为空时,暂停时间
if (!hasRedisDataFailed) {
try {
Thread.sleep(redisDataReadIntervalSeconds * 1000);
} catch (InterruptedException e) {
LOG.error(e);
}
}
} catch (Exception ex) {
LOG.error(ex);
}
// 无限执行时,短暂等待
try {
Thread.sleep(redisDataReadWaitInMillis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
productor.start();
}
解决方法:
@Component
@Order(value = Ordered.LOWEST_PRECEDENCE)
public class MsgUpdateTask {
private final Log LOG = LogFactory.getLog(this.getClass());
@Resource
@Qualifier("jedis")
private JedisCommands jedisCommands;
@Resource
@Qualifier("httpClient")
private HttpClient httpClient;
@Resource
@Qualifier("quickThreadPoolTask")
private ThreadPoolTaskExecutor quickSmsTaskExecutor;
@Resource
@Qualifier("slowThreadPoolTask")
private ThreadPoolTaskExecutor slowSmsTaskExecutor;
@Resource
@Qualifier("failUpdateThreadPoolTask")
private ThreadPoolTaskExecutor failUpdateThreadPoolTask;
@Resource
private EmailCreate emailCreate;
@Resource
private SmsProperty smsProperty;
static ApplicationContext context;
private Thread productor;
@Value("${im.emailSendSlowThreadPoolSize}")
private int poolSize;
@Resource
private MdlDataService dataService;
static {
context = new ClassPathXmlApplicationContext("applicationContext.xml");
}
// redis数据读取一次读取数据条数
@Value("${im.update.redisDataReadSize}")
private int redisDataReadSize;
// redis数据读取无限执行等待时间(毫秒)
@Value("${im.msgSend.redisDataReadWaitInMillis}")
private int redisDataReadWaitInMillis;
// redis数据读取,无数据时的间隔时间(秒)
@Value("${im.msgSend.redisDataReadIntervalSeconds}")
private int redisDataReadIntervalSeconds;
public MsgUpdateTask() {
//取消init方法
}
@PostConstruct//改用该注解
private void init() {
productor = new Thread() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
// 邮件(快)
boolean hasRedisDataFailed = send(ImConstant.REDIS_QUEUE_SEND_FAILED, failUpdateThreadPoolTask, redisDataReadSize);
// 获取redis数据为空时,暂停时间
if (!hasRedisDataFailed) {
try {
Thread.sleep(redisDataReadIntervalSeconds * 1000);
} catch (InterruptedException e) {
LOG.error(e);
}
}
} catch (Exception ex) {
LOG.error(ex);
}
// 无限执行时,短暂等待
try {
Thread.sleep(redisDataReadWaitInMillis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
productor.start();
}