Spring - 在异步调用中使用注入的请求作用域组件

时间:2013-10-28 19:34:21

标签: spring

我有一个需要在异步模式下执行某些操作的休息服务。 REST服务对范围请求组件执行操作。

我的问题: 我是否允许在新线程中使用请求范围组件(在原始http请求线程之外)? 对于需要在范围的最后创建的实体管理器等资源,当spring将立即关闭它们会发生什么?它会在http请求的末尾,所以实体管理器可以在异步调用的中间关闭吗?

此方案的配方是什么?什么应该是PaymentService的范围,所以实体经理将围绕异步调用打开和关闭? 我可以明确地做,但我正在寻找最佳实践,以防存在。

public class RestPayment{
      @Autowired PaymentService paymentService;

      public void pay(){
             new Thread(new Runnable() {
                  public void run() {
                     paymentService.charge(....);           
              }
               }).start();
      }
}

@Component
@Scope(value="request")
public class PaymentService{
        @Transactional(value="MainDB", propagation=Propagation.REQUIRED)
        public void charge(...){
        }
}

1 个答案:

答案 0 :(得分:0)

我会说,当你称之为“新”时,春天已经不在了。该对象不是由bean工厂创建的,因此它不受Spring控制。它不会注入那些依赖关系 - 这一切都在你身上。

更好的解决方案是创建一个受Spring控制的执行程序服务池。让它创建您要执行的Runnable类。这样就知道要注入你需要的服务。