2012-08-02 19 views
5

aşağıdaki Spring's documentation için TaskExecutor kullanmak yolu göre gibidir:Spring TaskExecutor'ın oluşturduğu iş parçacığını nasıl otomatikleştirebilirim?

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

Ancak MessagePrinterTask biz (bu sayı en az Spring'in bağlamı dışında bizim fasulye başlatmasını çünkü onlar Bahar tarafından yapılandırılan olmayacak bağımlılıkları autowired ise Bahar, gerçek iplik oluşumunu sağlayacak olsa bile bunu nasıl anladım. MessagePrinterTask Eğer biz Bahar tanıyabilmesi için olsun nasıl bağımlılıkları autowired etmiş idi? Ben boşuna aşağıdaki değiştirilmiş örnek çalıştı (ve evet, Autowiring düzgün etkindir):

a:

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

cevap

11

Galiba bu konuda gidebilirsiniz düşünüyorum iki yolu vardır.

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


    private ADependency aDependency; 

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

Ve TaskExectorExample içinde singleton olabilen:

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 bu şekilde - Görev için bağımlılıkları sağlayın. senin MesasgePrinterTask üzerinde @Configurable ek açıklaması kullanan bu bir bahar Konteyner dışında örneği olsa MessagePrinterTask içine bağımlılıkları enjekte edecektir - gerçi @Configurable kullanarak bazı yakalar vardır (AspectJ'yi gerektirir):

@Configurable 
class MessagePrinterTask implements Runnable { 
+0

teşekkürler. Öneri a. Şu anda ne yapıyorum ama bunları kullanamaz bir sınıfta bir yapıcı artı autowire bağımlılıkları sürdürmek zorunda çünkü bu biraz sinir bozucu. Öneri gördüm b. ama bu görevi yerine getirmenin en çok Spring yolu olup olmadığından emin değilim. Yine de teşekkürler! – Jorge

+0

Şu anda, seçenek olarak bastığında @Configurable kullanıyorum a. Uygulamam çok fazla iş parçacığı oluşturmuyor ya da yeterli oluyor. – Jorge

1

Ayrıca şunu da yapabilirsiniz @ Async ek açıklamasını kullanın.

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

} 

printMessage için herhangi bir çağrı() uyumsuz size Bahar xml config aşağıdaki kullanarak yapılandırabilir hangi varsayılan bir vasisi kullanılarak yürütülecektir. Hızlı cevap Biju için

<task:annotation-driven executor="myExecutor"/> 
<task:executor id="myExecutor" pool-size="5" /> 
İlgili konular