2012-08-02 6 views
5

Nach Spring's documentation die Art und Weise der TaskExecutor zu verwenden ist, wie folgt:Wie kann ich einen Spring TaskExecutor automatisch erstellen?

import org.springframework.core.task.TaskExecutor; 

public class TaskExecutorExample { 

    private class MessagePrinterTask implements Runnable { 

    private String message; 

    public MessagePrinterTask(String message) { 
     this.message = message; 
    } 

    public void run() { 
     System.out.println(message); 
    } 

    } 

    private TaskExecutor taskExecutor; 

    public TaskExecutorExample(TaskExecutor taskExecutor) { 
    this.taskExecutor = taskExecutor; 
    } 

    public void printMessages() { 
    for(int i = 0; i < 25; i++) { 
     taskExecutor.execute(new MessagePrinterTask("Message" + i)); 
    } 
    } 
} 

Wenn jedoch MessagePrinterTask autowired Abhängigkeiten hat, wird sie nicht von Spring konfiguriert werden, da wir unsere Bean Kontext außerhalb des Frühlings sind Instanziieren (zumindest das ist wie ich es verstehe), obwohl Spring die eigentliche Thread-Erstellung liefert. Wenn MessagePrinterTask autowired Abhängigkeiten haben sollte, wie bekommen wir Spring sie zu erkennen? Ich habe versucht, die folgenden modifizierten Beispiel ohne Erfolg (und ja, ist autowiring aktiviert richtig):

import org.springframework.core.task.TaskExecutor; 

public class TaskExecutorExample { 

    @Component 
    private class MessagePrinterTask implements Runnable { 

    @Autowired 
    private autoWiredDependency; 

    public void run() { 
     autoWiredDependency.doNotThrowNullPointerExceptionPlease(); 
    } 

    } 

    private TaskExecutor taskExecutor; 

    public TaskExecutorExample(TaskExecutor taskExecutor) { 
    this.taskExecutor = taskExecutor; 
    } 

    public void printMessages() { 
    for(int i = 0; i < 25; i++) { 
     taskExecutor.execute(new MessagePrinterTask()); 
    } 
    } 
} 

Antwort

11

Es gibt zwei Möglichkeiten, wie ich denke, dass man darüber gehen kann:

a. Geben Sie die Abhängigkeiten der Aufgabe - auf diese Weise:

class MessagePrinterTask implements Runnable { 
    public MessagePrinterTask(ADependency aDependency){ 
     this.aDependency = aDependency; 
    } 


    private ADependency aDependency; 

    public void run() { 
     aDependency.doNotThrowNullPointerExceptionPlease(); 
    } 
} 

Und in Ihrem TaskExectorExample, die das Singleton sein kann:

import org.springframework.core.task.TaskExecutor; 

public class TaskExecutorExample { 

    @Autowired private ADependency aDependency; 

    @Autowired 
    public TaskExecutorExample(TaskExecutor taskExecutor) { 
    this.taskExecutor = taskExecutor; 
    } 

    public void printMessages() { 
    for(int i = 0; i < 25; i++) { 
     taskExecutor.execute(new MessagePrinterTask(this.aDependency)); 
    } 
    } 
} 

b. Mit @Configurable Anmerkung auf Ihrem MesasgePrinterTask, dies in Abhängigkeiten in MessagePrinterTask injizieren, obwohl es außerhalb eines Frühlings-Container instanziiert wird - es gibt einige Fänge bei der Verwendung @Configurable obwohl (erfordert AspectJ):

@Configurable 
class MessagePrinterTask implements Runnable { 
+0

Danke für die schnelle Antwort Biju. Vorschlag a. ist das, was ich gerade mache, aber es ist ein bisschen nervig, da ich einen Konstruktor und Autowire-Abhängigkeiten in einer Klasse beibehalten muss, die sie nicht benutzen kann. Ich habe einen Vorschlag gesehen b. aber ich bin mir nicht sicher, ob es der beste Weg ist, diese Aufgabe zu erfüllen. Trotzdem danke! – Jorge

+0

Ich verwende jetzt @Configurable, da es die Option a übertrifft. Meine Anwendung instanziiert nicht viele Threads, also reicht es aus. – Jorge

1

Sie können auch Verwenden Sie die @ Async-Annotation.

public class TaskExecutorExample { 

    @Autowired 
    private MessagePrinterTask task; 

    public void printMessages() { 
     for(int i = 0; i < 25; i++) { 
      task.printMessage(); 
     } 
    } 
} 

@Component 
public class MessagePrinterTask implements Runnable { 

    @Autowired 
    private String message; 

    @Async 
    public void printMessage() { 
     System.out.println(message); 
    } 

} 

Jeder Aufruf Printmessage() asynchron ein Default-Executor verwendet werden ausgeführt, was Sie können mit dem folgenden in Ihrem Spring-XML-Konfiguration konfigurieren.

<task:annotation-driven executor="myExecutor"/> 
<task:executor id="myExecutor" pool-size="5" /> 
Verwandte Themen