当前位置: 首页 > 知识库问答 >
问题:

使用springboot,如何在异步方法中访问存储库?

彭风华
2023-03-14

我正在尝试在从CrudRepository扩展的存储库接口上执行.findAll()。我试图在@Async方法中使用存储的@Autowire实现来执行此操作。当我运行以下代码时,@Async线程在 UpdateTasksService List 中永久等待

当我从updateTasks()方法中删除@Async注释时,程序将按预期运行并打印所有.toString()数据。

我的问题是:

  1. 为什么我不能在@Async方法中使用@Autow的TaskRepository taskRepo;
  2. 如何在@Async方法中使用存储库?

提前感谢您!

计划组件

@Component
public class ScheduleComponent {

    @Autowired
    UpdateTasksService updateTasks;

    @PostConstruct
    public void update(){
        Future<Void> updateTasksFuture = updateTasks.updateTasks();
        try {
            updateTasksFuture.get();
            System.out.println("Done");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

UpdateTaskService

@Service
public class UpdateTasksService {

    @Autowired
    TaskRepository taskRepo;

    @Async
    public Future<Void> updateTasks() {
        System.out.println("The method starts");
        List<Task> tasks = (List<Task>)taskRepo.findAll();
        for(Task task: tasks){
            System.out.println(task.toString());
        }
        return new AsyncResult<Void>(null);
    }
}

任务库

@Repository
public interface TaskRepository extends CrudRepository<Task, String> {
}

共有1个答案

尉迟德惠
2023-03-14

我遇到了同样的问题,并注意到当查询基于JDBC API(而不是JPA存储库)或在SpringData存储库中使用@Query定义查询时不会发生这种行为。作为一种解决方法,我在PostConstruct中的一个存储库上调用了刷新。我仍然不知道为什么会发生这种情况。

解决方法:

 @Service
    public class UpdateTasksService {
    
        @Autowired
        TaskRepository taskRepo;
        
         @PostConstruct
        public void init() {
            //Workaround to a async method that waits forever when called  
            //from PostConstruct from another component
            taskRepo.flush();
        }
    
        @Async
        public Future<Void> updateTasks() {
            System.out.println("The method starts");
            List<Task> tasks = (List<Task>)taskRepo.findAll();
            for(Task task: tasks){
                System.out.println(task.toString());
            }
            return new AsyncResult<Void>(null);
        }
    }
 类似资料:
  • 用mockito模仿异步(< code>@Async)方法的最好方法是什么?提供以下服务: 莫基托的验证如下: 测试方法上面将始终抛出: 如果我从方法中删除,则不会发生上述异常。 Spring Boot版本:1.4.0.RELEASE Mockito版本:1.10.19

  • 问题内容: 我正在用React Native构建一个应用程序。我想尽量减少与数据库通信的频率,因此我大量使用了AsyncStorage。虽然在DB和AsyncStorage之间的转换中存在很多错误的余地。因此,我想通过对它运行自动化测试来确保AsyncStorage拥有我相信的数据。令人惊讶的是,我还没有找到有关如何在线进行操作的任何信息。我自己尝试做的尝试还没有完成。 使用笑话: 此方法失败,并

  • 本文向大家介绍SpringBoot异步任务使用方法详解,包括了SpringBoot异步任务使用方法详解的使用技巧和注意事项,需要的朋友参考一下 步骤,如图所示: 1.添加异步任务业务类 2.添加测试控制器 3.添加启动类 4.右键项目Run As启动,访问url 结果: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍SpringBoot开启异步调用方法,包括了SpringBoot开启异步调用方法的使用技巧和注意事项,需要的朋友参考一下 异步调用无需等待,方法相当于子线程,后台执行,主线程执行完成,子线程开始执行。 SpringBoot 开启异步执行仅需两步: 方法上加 @Async main 方法 开启 @EnableAsync controller 执行结果 可以看到 controller 先

  • 在Facebook关于Flux架构的演讲中,Jing在12:17提到dispatcher强制要求,在当前操作被商店完全处理之前,不能调度任何操作。 这里的调度员是执行没有级联效应的主要部分;一旦一个操作进入商店,在商店完全处理完它之前,您不能再放入另一个操作。 那么,我的问题是,如何正确地处理可能从存储区中删除的长时间运行的异步操作(例如,Ajax请求,或处理其他外部异步API)--任何阻止完成操

  • 我从以下操作方法调用它: 那么这是正确的做法吗?正如我所做的: > 我将存储库方法定义为任务&也将动作方法定义为任务。那么我应该把它们都作为任务吗? //请注意,这只是存储库方法的一个简单示例,它只是用于保存模型,但我询问的是方法本身,因为我将在更复杂的存储库方法中使用此方法。