2012-08-02 16 views
5

Spring's documentation使用TaskExecutor接口的方式如下:如何自動編寫Spring TaskExecutor創建的線程?

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

但是,如果MessagePrinterTask已經自動連接,他們不會被Spring因爲我們實例化Spring的上下文我們的豆之外(至少這是可以配置的依賴我如何理解它),即使Spring將提供實際的線程創建。 如果MessagePrinterTask具有自動裝配的依賴關係,我們如何讓Spring識別它們?我嘗試了以下修改例無果(是的,自動裝配正確啓用):

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

回答

11

有兩種方法,我認爲,你可以去一下:

一個。提供依賴性的任務 - 是這樣的:

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


    private ADependency aDependency; 

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

而在你TaskExectorExample它可以是單:

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

灣您MesasgePrinterTask使用@Configurable註解,這將依賴關係注入MessagePrinterTask即使它被實例化Spring容器之外 - 有使用@Configurable雖然有些漁獲量(需要的AspectJ):

@Configurable 
class MessagePrinterTask implements Runnable { 
+0

感謝您的快速回復Biju。建議a。是我目前正在做的,但有點煩人,因爲我不得不在類中維護一個構造函數和自動裝配依賴關係。我見過建議b。但我不確定這是否是完成任務的最春天的方式。雖然謝謝! – Jorge 2012-08-03 17:25:27

+0

我現在使用@Configurable,因爲它擊敗了選項a。我的應用程序沒有實例化很多線程,所以它就足夠了。 – Jorge 2012-08-06 20:04:21

1

你也可以使用@Async註釋。

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任何調用()將異步使用默認的執行者,你可以使用在Spring XML配置以下配置執行。

<task:annotation-driven executor="myExecutor"/> 
<task:executor id="myExecutor" pool-size="5" /> 
相關問題