在多线程中注入spring对象

来源:互联网 发布:万网单域名控制台登录 编辑:程序博客网 时间:2024/06/14 05:22

今天遇到一个问题,在kafka的消费端,我是启的多线程去消费kafka的数据,其中在多线程的业务代码中注入了server层的对象,但是在实际执行的时候却发现注入不了,然后检查spring的xml 包扫描的配置,发现配置没有问题,后面才发现在多线程的线程内部不能注入spring容器所管理的对象,细想一下: 应该是因为在web容器启动的时候,spring并不能感知还未执行的线程中的对象注入.

然后换了一种思路,就是在开启线程之前在main线程中先注入server层的对象,然后在执行线程的时候把该对象作为参数传入到线程内部执行,前提是这个对象必须是无状态的或者说是线程安全的.

主线程的伪代码如下:

@Servicepublic class MainClassEG {@Autowiredprivate 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);    }}
原创粉丝点击