Отрегулируйте потоки, используемые поддержкой задач контейнера Spring - PullRequest
1 голос
/ 01 июня 2010

Можно ли настроить количество потоков, используемых поддержкой задач контейнера Spring?

Ответы [ 2 ]

1 голос
/ 01 июня 2010

Если вы хотите настроить его во время выполнения, то я считаю, что ваш единственный выбор - сделать это программно.

Добавьте java.util.concurrent.ExecutorService в поддержку задач Spring следующим образом:

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

<task:annotation-driven executor="executorService" />

Затем вы можете настроить потоки, используемые ExecutorService следующим образом:

@Inject
ExecutorService executorService;

public void adjustPoolSize() {
    ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executorService;
    threadPoolExecutor.setMaximumPoolSize(10);
    threadPoolExecutor.setCorePoolSize(20);
}

Я написал больше о параллелизме с Spring здесь .

0 голосов
/ 01 июня 2010

Если вы имеете в виду задачи, как в запланированных задачах, то я не верю в это, по крайней мере, не напрямую, поскольку выполнение задачи обычно выполняется синхронно, то есть два вызова одной и той же задачи выполняются в одном потоке - это по крайней мере верно для класса JDK Timer, который использует выделенный поток для каждого таймера, поэтому несколько срабатываний таймера выполняются в одном потоке.

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

Задание, вызванное таймером, выглядит следующим образом

   public class TimerTaskInvoker extends TimerTask
   {
       TaskExecutor  executor;
       Runnable      taskToRun;

       public void run() {
          executor.execute(taskRoRun);
       }
   }

В вашем весеннем конфиге

<!-- the thread pool for executing tasks -->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  <property name="corePoolSize" value="5" />
  <property name="maxPoolSize" value="10" />
  <property name="queueCapacity" value="25" />
</bean>

<!-- invokes your actual task from the timer -->
<bean id="yourTaskInvoker" class="TimerTaskInvoker">
    <property name="executor" value="taskExecutor"/>
    <property name="taskToRun">
       <bean class="YourTaskClass">
          <!-- your task properties etc... -->
       </bean>
    </property>
</bean>

<!-- schedules execution of yourTaskInvoker -->    
<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
    <!-- wait 10 seconds before starting repeated execution -->
    <property name="delay" value="10000" />
    <!-- run every 50 seconds -->
    <property name="period" value="50000" />
    <property name="timerTask" ref="yourTaskInvoker" />
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...