2014-02-21 5 views
0

Я использую ExecutorService в своем приложении и с фиксированным пулом потоков. Я заявил в моем файле XML пружинной, какExecutorservice shutdown и restart with Spring

<bean id="executorService" 
     class="java.util.concurrent.Executors" 
     factory-method="newFixedThreadPool" 
     destroy-method="shutdownNow"> 
    <constructor-arg value="5"/> 
</bean> 

Сейчас ситуация в моем коде, где я должен заставить выключение (с помощью shutdownNow) в ExecutorService, а затем перезапустить его. Я действительно новичок в Spring и не знаю, как это сделать. На данный момент я просто отправляю задания в службу, а затем делаю shutdownNow, но в моем требовании говорится, что я хочу перезапустить службу.

+0

Возможно, вам удастся с вызовом afterPropertiesSet() при условии, что вы действительно внедрили код установки для инициализации bean-компонента. –

+0

Нет, я не использую afterPropertiesSet(). Это унаследованный весенний код. Инициализация выполняется в методе main() и остается оттуда. Я хочу знать, каким образом я могу повторно инициализировать «свойство» для bean-компонента или же в случае shutdownNow для моего сервиса, мне придется повторно инициализировать весь bean-компонент? –

ответ

0

Могу ли я рекомендовать просто управление ExecutorService самостоятельно за бобом. Таким образом, вы можете предоставить api для вашего компонента для выключения и воссоздания новой службы Executor.

public class ExecutorServiceHolder { 

    private ExecutorService executorService; 

    //set this through normal Spring config 
    private int numThreads; 

    @PostConstruct //once the properties have been, initialize your executorservice.. 
    public void afterPropertiesSet() { 
     this.executorService = Executors.newFixedThreadPool(numThreads); 
    } 

    //This is just pseudo-code, you may want to enhance with more thorough checking 
    //to make sure that the previous pool is shutdown.. 
    public synchronized void shutDownAndRestart() { 
     this.executorService.shutdownNow(); 
     this.executorService = Executors.newFixedThreadPool(numThreads); 
    } 
+0

Это выглядит хорошо. Я могу попробовать это! Спасибо :) –

+0

Такой вид держателя для меня не кажется хорошей идеей. Бобы, которые изначально используют «ExecutorService» для отправки заданий, теперь должны быть введены с этим «ExecutorServiceHolder» и получить от него исполнительную службу. Я думаю, что лучше сделать вместо этого декоратор/обертку «ExecutorService», который будет заниматься «перезагрузкой», поэтому bean с помощью «ExecutorService» (кроме ответственного за перезапуск) будет прозрачным для такого изменения –

Смежные вопросы