web-dev-qa-db-ja.com

Spring 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のコンテキスト外でBeanをインスタンス化するため(少なくとも私はそれを理解しています)、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());
    }
  }
}
12
Jorge

あなたがこれについて行くことができると私が思う2つの方法があります:

a。タスクへの依存関係を提供します-この方法:

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

b。 MesasgePrinterTaskで@Configurableアノテーションを使用すると、Spring Containerの外部でインスタンス化されている場合でも、MessagePrinterTaskに依存関係が挿入されます-@ Configurableの使用にはいくつかの問題があります(AspectJが必要):

@Configurable
class MessagePrinterTask implements Runnable {
16
Biju Kunjummen

@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()の呼び出しは、デフォルトのエグゼキューターを使用して非同期で実行されます。これは、Springxml構成で以下を使用して構成できます。

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

この方法を試してください。

@Service
@Scope("prototype")
public invokeClass {

    @Autowired
    private ApplicationContext applicationContext;



    public void methodName(TestRequest input){
        TaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();

        taskExecutor.execute(new Runnable() {
            public void run() {

                applicationContext.getBean("testService", TestService.class).execute(input);
            }
        });
    }
}
0
Webster Lou