您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用Spring Data和Hibernate时如何正确执行后台线程?

使用Spring Data和Hibernate时如何正确执行后台线程?

使用Spring,你不需要自己的执行程序。一个简单的注释@Async将为你完成工作。只需heavyMethod在你的服务中为其添加注释并返回void或Future对象,你将获得一个后台线程。我会避免在控制器级别使用异步注释,因为这将在请求池执行程序中创建一个异步线程,并且你可能会用完“请求接受器”。

延迟异常的问题来自你怀疑来自没有会话的新线程。为避免此问题,你的异步方法应处理完整的工作。不要提供先前加载的实体作为参数。该服务可以使用EntityManager,也可以是事务性的。

我自己不会合并@Async,@Transactional因此我可以以任何一种方式运行该服务。我只是围绕服务创建一个异步包装器,并在需要时使用该包装器。(例如,这简化了测试)

@Service
public class AsyncService {

    @Autowired
    private Service service;

    @Async
    public void doAsync(int entityId) {
        service.doHeavy(entityId);
    }
}

@Service
public class Service {

    @PersistenceContext
    private EntityManager em;

    @Transactional
    public void doHeavy(int entityId) {
        // some long running work
    }
}
Java 2022/1/1 18:16:38 有664人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶