使用Spring,您不需要自己的执行程序。一个简单的注释
@Async将为您完成工作。只需
heavyMethod在您的服务中为其添加注释并返回void或
Future对象,您将获得一个后台线程。我会避免在控制器级别使用异步注释,因为这将在请求池执行程序中创建一个异步线程,并且您可能会用完“请求接受器”。
延迟异常的问题来自怀疑没有会话的新线程。为避免此问题,您的异步方法应处理全部工作。不要提供先前加载的实体作为参数。该服务可以使用EntityManager,也可以是事务性的。
我自己不会合并
@Async,
@Transactional因此我可以以任何一种方式运行该服务。我只是围绕服务创建一个异步包装器,并在需要时使用该包装器。(例如,这简化了测试)
@Servicepublic class AsyncService { @Autowired private Service service; @Async public void doAsync(int entityId) { service.doHeavy(entityId); }}@Servicepublic class Service { @PersistenceContext private EntityManager em; @Transactional public void doHeavy(int entityId) { // some long running work }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)