以前一般很少用多线程处理些问题,今天遇到一个问题,在kafka的消费端,我是启的多线程去消费kafka的数据,其中在多线程的业务代码中注入了server层的对象,但是在实际执行的时候却发现注入不了,然后检查spring的xml 包扫描的配置,发现配置没有问题,后面才发现在多线程的线程内部不能注入spring容器所管理的对象,细想一下: 应该是因为在web容器启动的时候,spring并不能感知还未执行的线程中的对象注入.
然后换了一种思路,就是在开启线程之前在main线程中先注入server层的对象,然后在执行线程的时候把该对象作为参数传入到线程内部执行,前提是这个对象必须是无状态的或者说是线程安全的.
当然也可以使用spring的上下文去getBean()来获取spring容器中的对象。
主线程的伪代码如下:
@Service
public class MainClassEG {
@Autowired
private ServiceEG service;
public void methodEG {
//执行消费
for (int i = 0; i < 3; i++) {
//在这里开启线程的时候传入spring注入的service
//如果把@Autowired注解的private ServiceEG service;写在XxxThread线程类里面,spring是不能注入的
executor.execute(new XxxThread(service,i);
}
}
}
XxxThread 线程的伪代码如下:
public class XxxThread implements Runnable {
private ServiceEg service;
private int threadFlag;
public XxxThread(ServiceEg service, int threadFlag) {
super();
this.service = service;
this.threadFlag = threadFlag;
}
public ServiceEg getService() {
return service;
}
public void setService(ServiceEg service) {
this.service = service;
}
public int getThreadFlag() {
return threadFlag;
}
public void setThreadFlag(int threadFlag) {
this.threadFlag = threadFlag;
}
@Override
public void run() {
service.doSomething(xxxx);
}
}