@Async 将 Bean 作用域从一个线程复制到另一个线程



我正在使用 Spring @Async 发出异步请求,我想知道,当我使用 @Async 时,如何将像休眠会话这样的豆子从一个线程传递到另一个线程?

问候。

您不能将休眠会话传递给另一个线程。某些 bean 连接到当前线程。活动数据库事务就是这样一个 Bean。Spring 将其保存在ThreadLocal中,并且没有 API 将其传递给另一个线程。

您需要做的是将要处理的对象传递给新线程,在那里获取新会话并将对象em.merge()到新会话中。或者,如果你想真正干净,你可以传递主键并从Hibernate再次加载对象。由于它们可能会在缓存中,因此这应该不是很昂贵。

只需在 ApplicationContext 中提供 bean 作用域,或者在声明 bean 的位置提供注释即可。如果 Bean 被多个线程使用,则无需执行任何显式操作即可复制范围

最新更新