最近的项目中有个问题是处理从ERP上传商品到电商慢的问题,之前的操作是ERP先上传对应的商品的图片到电商服务器,然后上传商品信息到电商数据库,这样存在一个问题,ERP上传图片到电商服务器速度很慢,因为要跨外网,改进的做法是,ERP先将商品信息上传到电商数据库,商品信息中包含有图片的绝对路径,图片的处理交由电商这边去上传,返回图片上传的地址,写到对应的表,这里想到的是用多线程去处理图片上传,好了,开始干活。
在商品信息保存完成后,开启一个线程
ImageThread imageThread =newImageThread(commonId);imageThread.start();
ImageThread线程类继承Thread,重写run方法,在run方法里面处理图片上传和写相关数据信息,在ImageThread类里面使用注解@Autowired注入了很多Dao,因为这里要查数据和写数据,写完相关逻辑后,开始愉快的跑起来。
打开Postman开始调用接口,好嘞,商品上传完成,返回commonId,多线程进入到ImageThread类里面,调试发现注入的Dao全为null,以为是配置文件没开启注解扫描,类没写@Component注解等错误,都检查了一遍,发现没错,回过头来看了下开线程的方法,开启线程使用了new,可是项目是使用spring来管理对象的啊,这里竟然用了new来创建对象,GG,如果用new创建对象那还要spring干什么用。于是开始搜索spring多线程处理,原来spring对多线程的支持很简单,直接贴代码吧。
定义配置类:
写要执行的任务:
直接调用:
完成。
出现这个为空的问题还是因为自己对spring的对象管理理解不够透彻,使用spring注解注入取不到值主要有以下几种情况:
注解扫描没有扫描到对应的包
类上没有加上相应的注解,例如:@Component,@Service,@Controller
使用了new创建对象
领取专属 10元无门槛券
私享最新 技术干货