Весна и многопоточность - PullRequest
       35

Весна и многопоточность

1 голос
/ 09 сентября 2011

Мне нужно запустить переменное число потоков, каждое из которых, в свою очередь, запускает различное количество потоков (то есть, я потоков, где I-й поток должен запускать потоки Ki) в приложении Spring.
Предполагая, что каждый из «I потоков» содержит внутренний класс, который автоматически подключается, как я буду генерировать эти экземпляры? Итак, у меня есть A bean, который должен каким-то образом генерировать I экземпляров bean-компонента, который должен управляться пружиной для удовлетворения его зависимостей.

Я написал короткий пример кода, который, как мне кажется, является основой для моего решения, и я пометил код, который я не знаю, как писать ???:

@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 содержит среди других членов numThreadsForMessageType, numRunsForMessageType и dataObj.

Ответы [ 3 ]

1 голос
/ 10 сентября 2011

Вы можете использовать аннотацию @ Configurable , чтобы Spring мог внедрить зависимости в ваших работников - даже те, которые явно не управляются контейнером Spring.

0 голосов
/ 12 сентября 2011

Как насчет передачи ссылки на 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 голосов
/ 09 сентября 2011

Вместо того, чтобы запускать свои собственные потоки, лучше использовать пул потоков или абстракцию задачи Spring * Spring executor.Тогда вашими задачами могут быть Spring bean или экземпляры, созданные вручную.

...