如何自动assemblySpring 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识别它们? 我尝试了以下修改示例无效(是的,正确启用了自动assembly):
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()); } } }
我认为有两种方法可以解决这个问题:
一个。 提供任务的依赖关系 – 这样:
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注释,这将dependency injectionMessagePrinterTask,即使它是在Spring容器之外实例化的 - 虽然使用@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()的任何调用都将使用默认执行程序异步执行,您可以使用Spring xml配置中的以下内容进行配置。
- 如何使C#名称空间像Java包一样工作,以便在移动它们时自动重命名?
- JList选择项目为String
- 如何在Java中的新进程中启动“main”?
- 为什么Java对象中存在内部碎片,即使每个字段都是4字节对齐的?
- java.lang.ClassNotFoundException:来自xerial的Sample.java程序中的org.sqlite.JDBC错误
- 参考Java中的本地DTD
- 如何将Grizzly请求注入Jersey ContainerRequestFilter
- 用于KML的Java API(JAK)以kmz文件嵌入图像
- long polling netty nio framework java