2012-08-02 1 views
5

のTaskExecutorを使用するSpring's documentationによる方法がある:MessagePrinterTaskは依存関係をautowiredしている場合、我々はSpringのコンテキストの外で私たちのBeanをインスタンス化しているため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)); 
    } 
    } 
} 

はしかし、彼らは春で構成されません(少なくとも、それはですSpringが実際のスレッド作成を提供するにもかかわらず) MessagePrinterTaskがautowired依存関係を持つ場合、どのように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

は、私はあなたがこれについて行くことができると思います2つの方法があります。タスクへの依存性を提供 - この方法:

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:シングルトンすることができ

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


    private ADependency aDependency; 

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

そして、あなたのTaskExectorExampleでを。あなたのMesasgePrinterTaskに@Configurable注釈を使用して、これは春のコンテナの外側でインスタンス化されていてもMessagePrinterTaskへの依存関係に注入します - しかし@Configurable使用して、いくつかの漁獲量がある(AspectJの必要):

@Configurable 
class MessagePrinterTask implements Runnable { 
+0

クイックリプライBijuに感謝します。提案a。私が現在行っていることですが、コンストラクタとそれを使用しないクラスのautowire依存関係を維持しなければならないので、ちょっと面倒です。私は提案bを見た。しかし、それがタスクを達成するための最も春の方法であるかどうかはわかりません。しかし、ありがとう! – Jorge

+0

私はオプション@を打ち負かすので@Configurableを使用しています。私のアプリケーションは多くのスレッドをインスタンス化しないので十分です。 – Jorge

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(への任意の呼び出し)は、あなたの春のXML設定に以下のものを使用して設定することができ、デフォルトのexecutorを使用して、非同期で実行されます。

<task:annotation-driven executor="myExecutor"/> 
<task:executor id="myExecutor" pool-size="5" /> 
関連する問題