2011-09-09 99 views
1

我需要启动一个可变数目的线程继而每个开始变化的数量的线程(即我的线程,其中第i个线程需要开始起的线程)中的弹簧的应用。
假设每个“我线程”的包含该自动装配我将如何产生这些实例的内部类? 所以我有一个A bean需要以某种方式生成一个bean的实例,需要进行spring管理以满足其依赖关系。Spring和多线程

我写的是什么,我认为是我的解决方案的基础很短的示例代码和我打上代码我不知道如何???写:

@Component 
public class MasterOrchestrator {  
public void do(List<DataObjWrapper> list){ 
    ExecutorService es = Executors.newFixedThreadPool(list.size()); 
    for (DataObjWrapper dataObjWrapper : list){ 
     es.submit(???); 
    } 
}  
} 
@Component 
public class ThreadWorkerI implements Runnable{  
    private int numThreadsForMessageType; 
    private int numRunsForMessageType; 
    private DataObj dataObj; 
     public ThreadWorkerI(int numThreadsForMessageType, int numRunsForMessageType, DataObj dataObj){ 
     this.numThreadsForMessageType = numThreadsForMessageType; 
     this.numRunsForMessageType = numRunsForMessageType; 
     this.dataObj = dataObj; 
    } 
     @Autowired 
    private JmsTemplate jmsTemplate; 
    public void run(){ 
     ExecutorService es = Executors.newFixedThreadPool(numThreadsForMessageType); 
     for (int i=0;i<numRunsForMessageType;i++){ 
      es.submit(new ActualWorker(i)); 
     }  
    } 

    private class ActualWorker implements Runnable{ 
     private int numRun; 
     private ActualWorker(int numRun){ 
      this.numRun = numRun; 
     } 
     public void run(){ 
      //send message using the jmsTemplate the dataObj and numRun 
     } 
    } 
} 

DatObjWrapper包含除其他成员numThreadsForMessageTypenumRunsForMessageTypedataObj

回答

0

而是开始你自己的线程,最好是使用线程池或Spring的task executor抽象的。然后你的任务可以是Spring bean或手动实例化。

+0

我去了你给的链接在这里(前),我不知道这是如何能帮助我。请注意,在这个例子中,他们将自己实例化为'MessagePrinterTask'实例,这意味着不存在弹簧管理的bean。如果“I threads”以某种方式被spring管理的bean,那么他们可以自动装配我需要的东西,并且他们将实例化一个可以访问其自动装配资源的内部类。问题在于第一个链接。我可以只做context.getBean,但我宁愿不要。 – Ittai

1

您可以使用@Configurable注解来让Spring依赖注入你的工人 - 即使不是由Spring容器明确管理的一个人。

+0

嗨,谢谢你的回答。从链接的外观和一些快速搜索功能看来,@Configurable似乎可以解决这个问题,我只是不确定它是否是解决它的“春天方式”。我会稍等一下,看看是否有人提供了一种方法,让我留在容器中,仍能满足我的需求。如果没有,我会接受你的回答(我已经提出了你的意见)。 – Ittai

+0

此外,只是为了验证,因为我对织造业务不熟悉 - 如果我使用LTW,那么我只会为类的对象的第一个实例化付出“严重”的代价?之后它就像一个普通的春季豆子(当然有一些开销) – Ittai

0

如何传递一个参考MasterOrchestrator或ThreadWorker到Runnable的构造?然后你可以把所有的配置放到@Component类中。

例如:

private class ActualWorker implements Runnable{ 
     private int numRun; 
     private ActualWorker(ThreadWorkerI owner, int numRun){ 
      this.numRun = numRun; 
     } 
     public void run(){ 
      //send message using owner.jmsTemplate, owner.dataObj and numRun 
     } 
    } 
+0

我很抱歉,但这感觉就像一个解决方法给我。我也认为Biju的解决方案是一种解决方法,但由于ActualWorker是以某种方式管理的,所以它更加优雅。我仍然在寻找这样做的“春天之路”。如果我找到它,我会在这里更新。 – Ittai