web-dev-qa-db-fra.com

Un bon threading Spring avec des exemples TaskExecutor?

J'essaie de comprendre comment implémenter le filetage dans une application Java qui utilise Spring pour la gestion des transactions. J'ai trouvé la section TaskExecutor dans la documentation Spring =, et ThreadPoolTaskExecutor semble correspondre à mes besoins;

ThreadPoolTaskExecutor

Cette implémentation ne peut être utilisée que dans un environnement Java 5 mais elle est également la plus couramment utilisée dans cet environnement. Elle expose les propriétés du bean pour configurer un Java.util.concurrent.ThreadPoolExecutor et l'encapsule dans un TaskExecutor. Si vous avez besoin de quelque chose de avancé tel qu'un ScheduledThreadPoolExecutor, il est recommandé d'utiliser un ConcurrentTaskExecutor à la place.

Cependant, je n'ai aucune idée de comment l'utiliser. Je cherche de bons exemples depuis un moment sans succès. Si quelqu'un peut m'aider, je l'apprécierais.

25
James McMahon

C'est assez simple. L'idée est que vous avez un objet exécuteur qui est un bean, qui est passé dans l'objet qui veut déclencher la nouvelle tâche (dans un nouveau thread). La bonne chose est que vous pouvez modifier le type d'exécuteur de tâches à utiliser en changeant simplement la configuration de Spring. Dans l'exemple ci-dessous, je prends un exemple de classe (ClassWithMethodToFire) et je l'enveloppe dans un objet Runnable pour faire le feu; vous pouvez également implémenter Runnable dans une classe à part, puis dans la méthode execute, vous appelez simplement classWithMethodToFire.run().

Voici un exemple très simple.

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 );
               }
          });
     }
}

Et voici les haricots de printemps:

<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>
34
Jacob Mattison