1、情况描述
使用springboot2多线程,线程类无法实现自动注入需要的bean,解决思路,通过工具类获取需要的bean
在多线程处理问题时,无法通过@Autowired注入bean,报空指针异常,
在线程中为了线程安全,是防注入的,如果要用到这个类,只能从bean工厂里拿个实例。那我们只有手动获取,
解决方案如下:
本类是获取bean的工具类,也是交给spring管理,通过程序的上下文获取,在需要注入bean的类中,使用构造方法调用对应获取bean的方法给需要注入对象注入代理bean
如下代码:
public class RedisMessageConsumer implements Runnable {
//无法自动注入
private JedisClient jedisClient;
//无法自动注入
private PensionExtendService pensionExtendService;
//无法自动注入
private RealEstateExtendService realEstateExtendService;
//可以通过构造方法带入参数注入
public RedisMessageConsumer(JedisClient jedisClient, PensionExtendService pensionExtendService, RealEstateExtendService realEstateExtendService) {
this.jedisClient = jedisClient;
this.pensionExtendService = pensionExtendService;
this.realEstateExtendService = realEstateExtendService;
}
private void consumerPensionMessage() {
String json = jedisClient.rpop(Constants.PENSION_EMPTY_PEOPLE_KEY);
if (StringUtils.isNotEmpty(json)) {
ResidentUpdateParam residentUpdateParam = JSONObject.parseObject(json, ResidentUpdateParam.class);
if (OperateStatusEnum.ADD.getValue().equals(residentUpdateParam.getOperateStatus())) {
ResidentAddParam residentAddParam = ObjectCopyUtil.bean2Bean(residentUpdateParam, ResidentAddParam.class);
RestResult<IdVO> add = pensionExtendService.addPensionFromCommunity(residentAddParam);
log.info("添加了社区的物业人员数据 :{} id为 {}", residentUpdateParam ,add.getData().getId());
} else if (OperateStatusEnum.EDIT.getValue().equals(residentUpdateParam.getOperateStatus())) {
RestResult<IdVO> update = pensionExtendService.updatePensionFromCommunity(residentUpdateParam);
log.info("修改了社区的物业人员数据 :{} id为 {}", residentUpdateParam ,update.getData().getId());
} else if (OperateStatusEnum.DELETE.getValue().equals(residentUpdateParam.getOperateStatus())) {
ResidentDeleteParam residentDeleteParam = new ResidentDeleteParam();
residentDeleteParam.setId(residentUpdateParam.getId());
RestResult<IdVO> delete = pensionExtendService.deletePensionFromCommunity(residentDeleteParam);
log.info("删除了社区的物业人员数据 :{} id为 {}", residentUpdateParam ,delete.getData().getId());
} else {
log.error("社区老人数据有误 :未指明操作状态 {}", residentUpdateParam);
}
}
}
private void consumerRealEstateMessage() {
String json = jedisClient.rpop(Constants.PROPERTY_USER_KEY);
if (StringUtils.isNotEmpty(json)) {
RealEstateUpdateParam realEstateUpdateParam = JSONObject.parseObject(json, RealEstateUpdateParam.class);
if (OperateStatusEnum.ADD.getValue().equals(realEstateUpdateParam.getOperateStatus())) {
RealEstateAddParam realEstateAddParam = ObjectCopyUtil.bean2Bean(realEstateUpdateParam, RealEstateAddParam.class);
RestResult<IdVO> add = realEstateExtendService.add(realEstateAddParam);
log.info("添加了社区的物业人员数据 :{} id为 {}", realEstateUpdateParam ,add.getData().getId());
} else if (OperateStatusEnum.EDIT.getValue().equals(realEstateUpdateParam.getOperateStatus())) {
RestResult<IdVO> update = realEstateExtendService.update(realEstateUpdateParam);
log.info("修改了社区的物业人员数据 :{} id为 {}", realEstateUpdateParam,update.getData().getId());
} else if (OperateStatusEnum.DELETE.getValue().equals(realEstateUpdateParam.getOperateStatus())) {
RealEstateDeleteParam realEstateDeleteParam = new RealEstateDeleteParam();
realEstateDeleteParam.setThirdPartyUserId(realEstateUpdateParam.getThirdPartyUserId());
RestResult<IdVO> delete = realEstateExtendService.delete(realEstateDeleteParam);
log.info("删除了了社区的物业人员数据 :{} id为 : {}", realEstateUpdateParam,delete.getData().getId());
} else {
log.error("社区物业人员数据有误 :未指明操作状态 {}", realEstateUpdateParam);
}
}
}
@Override
public void run() {
while (true) {
System.out.println("线程执行");
consumerPensionMessage();
consumerRealEstateMessage();
//休眠两秒
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}