我正在尝试在从CrudRepository扩展的存储库接口上执行.findAll()。
我试图在@Async
方法中使用存储库的@Autowire
实现来执行此操作。当我运行以下代码时,@Async
线程在 UpdateTasksService List 中永久等待
当我从updateTasks()方法中删除
@Async
注释时,程序将按预期运行并打印所有.toString()数据。
我的问题是:
为什么我不能在@Async
方法中使用@Autow的TaskRepository taskRepo;
?
- 如何在
@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> {
}
我遇到了同样的问题,并注意到当查询基于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)--任何阻止完成操
我从以下操作方法调用它: 那么这是正确的做法吗?正如我所做的: > 我将存储库方法定义为任务&也将动作方法定义为任务。那么我应该把它们都作为任务吗? //请注意,这只是存储库方法的一个简单示例,它只是用于保存模型,但我询问的是方法本身,因为我将在更复杂的存储库方法中使用此方法。