2009-05-12 12 views
24

Sto cercando di capire come implementare il threading in un'applicazione Java che utilizza Spring per la gestione delle transazioni. Ho trovato la sezione TaskExecut in Spring documentation e ThreadPoolTaskExecutor sembra che si adatta alle mie esigenze;Qualche buon threading di Spring con un esempio di TaskExecutor?

ThreadPoolTaskExecutor

Questa implementazione può essere utilizzato solo in un ambiente Java 5, ma è anche il più comunemente usato uno in quell'ambiente. Espone le proprietà del bean per la configurazione di java.util.concurrent.ThreadPoolExecutor e lo avvolge in un TaskExecutor. Se hai bisogno di qualcosa di avanzato come ScheduledThreadPoolExecutor, si consiglia di utilizzare invece ConcurrentTaskExecutor.

Tuttavia, non ho idea di come utilizzarlo. Ho cercato buoni esempi per un po 'ora senza fortuna. Se qualcuno mi può aiutare, lo apprezzerei.

risposta

33

È piuttosto semplice. L'idea è di avere un oggetto executor che è un bean, che viene passato in qualunque oggetto desideri attivare la nuova attività (in una nuova discussione). La cosa bella è che puoi modificare il tipo di task executor da utilizzare semplicemente cambiando la configurazione di Spring. Nell'esempio seguente sto prendendo alcuni esempi di classe (ClassWithMethodToFire) e lo avvolgo in un oggetto Runnable per fare il fuoco; potresti anche implementare Runnable in una classe personalizzata, quindi nel metodo di esecuzione devi semplicemente chiamare classWithMethodToFire.run().

Ecco un esempio molto semplice.

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

e qui ci sono i fagioli di primavera:

<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

Penso che il mio problema sta pensando questo è più complessa, allora è. Ho visto http://docs.huihoo.com/javadoc/spring/2.0/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html#createQueue(int) e ho ipotizzato che ThreadPoolTaskExecutor avesse un meccanismo di accodamento incorporato. –

+0

Forse non mi sono sbagliato, perché è queueCapacity? Mi sento ancora come se mi mancasse qualcosa qui. –

+12

Se la capacità della coda è maggiore di 0, crea una coda, in modo che le attività attivate da un determinato TaskExecutor possano attendere fino a quando un thread è disponibile dal pool. La capacità indica quanti spazi ci sono nella coda. Se la coda si riempie, l'esecutore bloccherà (il metodo execute non tornerà finché non si apre uno spazio). Ecco il documento in coda: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/LinkedBlockingQueue.html –

Problemi correlati