java 如何在spring Boot 应用程序中添加异步执行?

pgky5nke  于 2022-12-21  发布在  Java
关注(0)|答案(2)|浏览(123)

在我的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");
                }
            }
        }  
    }
}

请帮帮我。

dtcbnfnu

dtcbnfnu1#

试着写一个名字,这样对我很有效
第一个月
在SprintBootApplication中,将以下内容放入
@EnableAsync
然后

@Bean("ThreadPoolTaskExecutor")
  public TaskExecutor getAsyncExecutor() {
    final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(100);
    executor.setMaxPoolSize(200);
    executor.setQueueCapacity(30);
    executor.setWaitForTasksToCompleteOnShutdown(true);
    executor.setThreadNamePrefix("Async-");
    executor.setTaskDecorator(new APMTaskDecorator());
    return executor;
  }
gstyhher

gstyhher2#

如果你在同一个类中使用@Async@Scheduled,异步方法仍然同步执行。@Async生成一个封装了原始方法的代理类。所以@Async只有在你从外部调用该方法时才有效。因此,同一个类中的@Scheduled仍然同步执行。
最简单的解决方案是将@Scheduled方法移到一个sperate类中。

@Service
public class ItemService {
    @Async
    public void saveAndSend() {

    }
}
@Service
public class ItemSchedulerService {

    private final ItemService itemService;

    public ItemSchedulerService(ItemService itemService) {
        this.itemService = itemService;
    }

    @Scheduled("...")
    public void schedule() {
        itemService.saveAndSend();
    }
}

相关问题