【问题标题】:Spring - use in injected request scope component in async callSpring - 在异步调用中的注入请求范围组件中使用
【发布时间】:2013-10-28 19:34:20
【问题描述】:

我有一个需要在异步模式下执行一些操作的休息服务。 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(...){
        }
}

【问题讨论】:

    标签: spring


    【解决方案1】:

    我会说春天在你称之为“新”的那一刻就消失了。该对象不是由 bean 工厂创建的,因此它不受 Spring 的控制。它不会注入那些依赖项——一切都在你身上。

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

    【讨论】:

    • 我假设你纠正了就像 jee 容器中的新线程一样,那么什么应该是在 http 范围内没有完成的异步操作的秘诀
    • 这类事情最好使用 JMS 或执行器服务来完成。新的并发包比使用原始线程编写更可取。
    • 我将使用执行器服务进行异步调用(新线程仅用于问题)。但这并不能解决付款服务范围的问题
    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多