Подтвердить что ты не робот

Любая хорошая Spring резьба с примерами TaskExecutor?

Я пытаюсь получить представление о том, как реализовать потоки в приложении Java, которое использует Spring для управления транзакциями. Я нашел раздел TaskExecutor в Spring документации, а ThreadPoolTaskExecutor выглядит так, как будто он соответствует моим потребностям;

ThreadPoolTaskExecutor

Эта реализация может использоваться только в среде Java 5, но также является наиболее часто используемой в этой среде. Он предоставляет свойства bean для настройки java.util.concurrent.ThreadPoolExecutor и обертывает его в TaskExecutor. Если вам нужно что-то продвинутое, например ScheduledThreadPoolExecutor, рекомендуется использовать ConcurrentTaskExecutor.

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

4b9b3361

Ответ 1

Это довольно просто. Идея состоит в том, что у вас есть объект-исполнитель, который bean, который передается в любой объект, который хочет запустить новую задачу (в новом потоке). Приятно, что вы можете изменить, какой тип исполнителя задач использовать, просто изменив конфигурацию Spring. В приведенном ниже примере я беру некоторый пример класса (ClassWithMethodToFire) и обертываю его в объект Runnable, чтобы сделать огонь; вы также можете реализовать Runnable в своем собственном классе, а затем в методе execute вы просто вызываете classWithMethodToFire.run().

Вот очень простой пример.

public class SomethingThatShouldHappenInAThread {
     private TaskExecutor taskExecutor;
     private ClassWithMethodToFire classWithMethodToFire;

     public SomethingThatShouldHappenInAThread(TaskExecutor taskExecutor,
                                               ClassWithMethodToFire classWithMethodToFire) {
          this.taskExecutor = taskExecutor;
          this.classWithMethodToFire = classWithMethodToFire;
     }

     public void fire(final SomeParameterClass parameter) {
          taskExecutor.execute( new Runnable() {
               public void run() {
                    classWithMethodToFire.doSomething( parameter );
               }
          });
     }
}

И вот Spring beans:

<bean name="somethingThatShouldHappenInAThread" class="package.name.SomethingThatShouldHappenInAThread">
     <constructor-arg type="org.springframework.core.task.TaskExecutor" ref="taskExecutor" />
     <constructor-arg type="package.name.ClassWithMethodToFire" ref="classWithMethodToFireBean"/>
</bean>

<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>