Multithreading 如何将@Autowire多任务提交给ExecutorService
我有一个Multithreading 如何将@Autowire多任务提交给ExecutorService,multithreading,spring,autowired,Multithreading,Spring,Autowired,我有一个@预定的服务 @Controller public class CheckInstanceStatus { @Autowired private CheckStatusTask checkStatusTask; @Autowired private InstanceQueue instanceQueue; private ThreadPoolExecutor executor; @PostConstruct void ini
@预定的
服务
@Controller
public class CheckInstanceStatus {
@Autowired
private CheckStatusTask checkStatusTask;
@Autowired
private InstanceQueue instanceQueue;
private ThreadPoolExecutor executor;
@PostConstruct
void init() {
executor = new ThreadPoolExecutor(20, 20, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
@Scheduled(fixedDelay = 2000)
public void checkInstanceStatus()
{
String instName = instanceQueue.poll();
checkStatusTask.setInstName(instName);
executor.submit(checkStatusTask);
}
}
@控制器
公共类CheckInstanceStatus{
@自动连线
私有CheckStatusTask CheckStatusTask;
@自动连线
私有InstanceQueue InstanceQueue;
私有线程池执行器;
@施工后
void init(){
executor=新的ThreadPoolExecutor(20,20,0L,TimeUnit.ms,new LinkedBlockingQueue());
}
@计划(固定延迟=2000)
public void checkInstanceStatus()
{
String instName=instanceQueue.poll();
checkStatusTask.setInstName(instName);
执行者提交(检查状态任务);
}
}
在本例中,我只能向线程池提交一个任务。我想获取队列中的所有(或部分)对象,并将它们放入任务列表(列表
)中,然后将它们全部提交到线程池,但我不知道如何在spring中创建任务列表(列表
)
我是否需要封装
任务列表
和@Autowired
它?在TaskList
中有一个List
成员来存储任务列表。否,您不需要将任务列表封装到它自己的类中。Spring将自动填充您自动关联的任何通用类型的列表。有关详细信息,请参阅文档
还可以从中提供特定类型的所有bean
ApplicationContext
将注释添加到
需要该类型的数组。。。这同样适用于打字
收藏
在这种情况下:
@Autowired
private List<CheckStatusTask> checkStatusTasks;
@Autowired
私有列表检查任务;
不,您不需要将任务列表封装到它自己的类中。Spring将自动填充您自动关联的任何通用类型的列表。有关详细信息,请参阅文档
还可以从中提供特定类型的所有bean
ApplicationContext
将注释添加到
需要该类型的数组。。。这同样适用于打字
收藏
在这种情况下:
@Autowired
private List<CheckStatusTask> checkStatusTasks;
@Autowired
私有列表检查任务;
建议在配置类(XML配置)中设置TaskExecutor Bean(调度程序Bean),如下面的示例所示。
然后必须使用@EnableAsync
注释配置类
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// taskExecutor properties...
return taskExecutor;
}
@Component
@Scope("prototype")
public class CheckStatusTask {
// ...
@Async
public void doTask(String instName) throws InterruptedException {
System.out.println("task: " + instName + "#" + new SimpleDateFormat("ddMMyyyy_HHmmss:SSS").format(Calendar.getInstance().getTime()));
//Thread.sleep(3000);
}
// ...
}
在XML中:
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
默认情况下,在方法上指定@Async时,将使用的执行器是提供给注释驱动元素的执行器,如上所述
要填写列表
,请实例化CheckStatusTask类型的各个对象并添加它们:
CheckStatusTask cst = new CheckStatusTask();
tasks.add(cst);
// cst.doTask("Task");
最后,您只需通过迭代列表来调用每个doTask方法。也许您可以直接调用此函数(在@Scheduled方法中)而不是
迭代并填充列表:
for (CheckStatusTask statusTask : getTasks()){
statusTask.doTask("Task");
}
建议将TaskExecutorbean(调度程序Bean)放在配置类(XMLConfig)中,如下面的示例所示。 然后必须使用
@EnableAsync
注释配置类
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// taskExecutor properties...
return taskExecutor;
}
@Component
@Scope("prototype")
public class CheckStatusTask {
// ...
@Async
public void doTask(String instName) throws InterruptedException {
System.out.println("task: " + instName + "#" + new SimpleDateFormat("ddMMyyyy_HHmmss:SSS").format(Calendar.getInstance().getTime()));
//Thread.sleep(3000);
}
// ...
}
在XML中:
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
默认情况下,在方法上指定@Async时,将使用的执行器是提供给注释驱动元素的执行器,如上所述
要填写列表
,请实例化CheckStatusTask类型的各个对象并添加它们:
CheckStatusTask cst = new CheckStatusTask();
tasks.add(cst);
// cst.doTask("Task");
最后,您只需通过迭代列表来调用每个doTask方法。也许您可以直接调用此函数(在@Scheduled方法中)而不是
迭代并填充列表:
for (CheckStatusTask statusTask : getTasks()){
statusTask.doTask("Task");
}
我还没有测试,但我想知道,在
@Autowired
之后,列表的大小是多少?我没有在applicationcontext.xml
中定义CheckStatusTask
bean。CheckStatusTask
对象是动态生成的,不能在applicationcontext.xml
中预定义。这对我来说可以吗?我还没有测试,但我想知道,在@Autowired
之后,列表的大小是多少?我没有在applicationcontext.xml
中定义CheckStatusTask
bean。CheckStatusTask
对象是动态生成的,不能在applicationcontext.xml
中预定义。这对我来说可以吗?您有什么版本的Spring(模块)以及在哪里定义TaskExecutor(配置)?Spring 4.1.7版本和TaskExecutor
在我的例子中是ThreadPoolExecutor
,它被定义为CheckInstanceStatus
的成员,并在@PostConstruct
中初始化。您有什么版本的Spring(模块)以及在哪里定义TaskExecutor(配置)?Spring 4.1.7版本和TaskExecutor
在我的例子中是ThreadPoolExecutor
,它被定义为CheckInstanceStatus
的成员,并在@PostConstruct
中初始化。