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());
}
}
}
あなたがこれについて行くことができると私が思う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 {
@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" />
この方法を試してください。
@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);
}
});
}
}