Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring-在异步调用中的注入请求作用域组件中使用_Spring - Fatal编程技术网

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

Spring-在异步调用中的注入请求作用域组件中使用,spring,Spring,我有一个rest服务,需要在异步模式下执行一些操作。 REST服务对作用域请求组件执行操作 我的问题: 我是否允许在新线程(原始http请求线程之外)中使用请求作用域组件? 当spring现在关闭需要在作用域末尾创建的资源(如EntityManager)时,会发生什么情况?它会在HTTP请求的结尾,所以实体管理器可以在异步调用中间关闭吗? 这种情况的秘诀是什么?PaymentService的作用域应该是什么,因此实体管理器将围绕异步调用打开和关闭? 我可以做它明确,但我正在寻找最佳实践的情况下存

我有一个rest服务,需要在异步模式下执行一些操作。 REST服务对作用域请求组件执行操作

我的问题: 我是否允许在新线程(原始http请求线程之外)中使用请求作用域组件? 当spring现在关闭需要在作用域末尾创建的资源(如EntityManager)时,会发生什么情况?它会在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(...){
        }
}

我想说,当你称之为“新”的那一刻,春天已经不存在了。该对象不是由bean工厂创建的,因此它不在Spring的控制之下。它不会注入这些依赖项——这一切都取决于您


更好的解决方案是创建一个受Spring控制的executor服务池。让它创建要执行的可运行类。通过这种方式,它将知道如何注入您需要的服务。

我假设您的正确性就像jee容器中的新线程一样,那么什么应该是http范围内没有完成的异步操作的方法呢?这些事情最好使用JMS或executor服务来完成。新的并发程序包比使用原始线程编写更可取。我将使用executer服务进行异步调用(新线程只是为了解决这个问题)。但是,这并不能解决paymentservice应该属于哪个范围的问题