在我的Spring Boot应用程序中,有一个调度器类,它每30分钟执行一次,获取大约20000条记录,然后将记录逐个插入数据库,然后将插入的记录转换为XML并发送到客户端,但这个过程要完成20000条记录需要太多时间,而且记录还在日益增加。
- 所以现在,我们必须在这段代码中实现异步执行编程,以便多个线程可以执行操作,而不是一个接一个的记录。例如:有4个线程,项目列表大小为6,则线程1将使用(0)个索引对象执行,线程2将使用(1)个索引对象执行,线程3将使用(2)个索引对象执行,线程4将使用(3)个索引对象执行,线程1将使用(4)个索引对象执行,线程2将使用(5)个索引对象执行**
差不多吧
- 对于本例,如何实现异步执行**
@Service
class ItemService
{
@autowired
private DemoDao dao;
@Scheduled(fixedRate=30000)
public void scheduler(){
try {
List<Item> itemList = dao.getItems();
saveAndSend(itemList);
} catch(Exception e) {
e.printStack();
}
}
public void saveAndSend(List<Item> itemList) throws Exception {
for(int i = 0; i < itemList.size(); i++){
if(itemList.get(i).isDone){
dao.save(itemList.get(i));
int flag = convertInXMLAndSendToTeam(itemList.get(i));
if(flag == 1){
dao.audit(itemList.get(i), "XEQ");
}
}
}
}
}
请帮帮我。
2条答案
按热度按时间dtcbnfnu1#
试着写一个名字,这样对我很有效
第一个月
在SprintBootApplication中,将以下内容放入
@EnableAsync
然后
gstyhher2#
如果你在同一个类中使用
@Async
和@Scheduled
,异步方法仍然同步执行。@Async
生成一个封装了原始方法的代理类。所以@Async
只有在你从外部调用该方法时才有效。因此,同一个类中的@Scheduled
仍然同步执行。最简单的解决方案是将
@Scheduled
方法移到一个sperate类中。