2009-05-12 6 views
24

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

ThreadPoolTaskExecutor

Cette mise en œuvre ne peut être utilisé dans un environnement Java 5 mais est aussi celui le plus couramment utilisé dans cet environnement. Il expose les propriétés du bean pour la configuration d'un fichier java.util.concurrent.ThreadPoolExecutor et l'enveloppe dans un TaskExecutor. Si vous avez besoin de quelque chose d'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. J'ai cherché de bons exemples pendant un certain temps maintenant sans aucune chance. Si quelqu'un peut m'aider, je l'apprécierais.

Répondre

33

C'est assez simple. L'idée est que vous avez un objet exécuteur qui est un bean, qui est passé dans n'importe quel 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âche à utiliser en changeant la configuration Spring. Dans l'exemple ci-dessous, je prends un exemple de classe (ClassWithMethodToFire) et l'enveloppe dans un objet Runnable pour faire le feu; vous pouvez également implémenter Runnable dans une classe qui vous est propre, puis dans la méthode d'exécution que 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 grains 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> 
+0

Je pense que mon problème pense que c'est plus complexe alors il est. J'ai vu http://docs.huihoo.com/javadoc/spring/2.0/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html#createQueue(int) et j'ai supposé qu'un ThreadPoolTaskExecutor avait un mécanisme intégré de mise en file d'attente. –

+0

Peut-être que je ne me suis pas trompé, à quoi sert la file d'attente? J'ai toujours l'impression de manquer quelque chose ici. –

+12

Si la capacité de la file d'attente est supérieure à 0, elle crée une file d'attente, de sorte que les tâches lancées par un TaskExecutor particulier puissent attendre qu'un thread soit disponible dans le pool. La capacité indique combien d'espaces sont dans la file d'attente. Si la file d'attente se remplit, l'exécuteur bloquera (c'est-à-dire que la méthode d'exécution ne retournera pas jusqu'à ce qu'un espace s'ouvre). Voici le doc dans la file d'attente: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/LinkedBlockingQueue.html –

Questions connexes