SpringBoot多线程无法注入问题(解决方案)

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();
            }
        }
    }

总结

可以通过全参构造方法注入

可以通过静态工厂注入

可以 通过ApplicationContextProvider.getBean(XXX.class) 注入

猜你喜欢

转载自blog.csdn.net/liuguang212/article/details/106874032