如何在生成多个线程的异步请求中处理bean生命周期

时间:2015-11-16 10:12:35

标签: java spring dependency-injection

问题: 是否存在一个线程的范围,它产生的线程一旦所有访问它的线程终止就支持它的破坏?如果不是,我必须自己实现它,还是我在Spring DI中得到Scopes的概念错了?

上下文
我有一个平台,它有一个REST-API,可以在其上启动进程,然后在服务器上运行。其中一些进程启动多个线程,其中一些仅在系统关闭时终止(例如,监听流并使用收到的数据执行操作)。
我想使用Spring进行依赖注入,现在需要在合适的范围内管理bean。

问题: 我想从请求中获取参数并在多个其他位置提供这些参数。我的方法是获取一个容器bean,它在请求处理程序中填充,然后在所有其他场合使用。一旦发送响应就立即销毁@Scope(“请求”),因为处理程序只产生一个线程,因此它不适用于此。

我阅读了springbyexample(http://www.springbyexample.org/examples/custom-thread-scope-module.html)中的ThreadScope实现以及修改spring SimpleThreadScope以支持生成线程(https://stackoverflow.com/a/14987371/4502203)层次结构内的继承的方法。两者都只是解决我的问题的一部分。 我需要的是一个支持销毁回调的Scope(因为我不热衷于内存泄漏)并继承到Child-Threads。

代码示例:

@RequestMapping(value = "/myApi/{parameterA}/{parameterB}", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE})
public  @ResponseBody void doFancyStuff(@PathVariable String parameterA, @PathVariable String parameterB) {
    new Thread(() -> {
        ParameterContainer parameterContainer = applicationContext.getBean(ParameterContainer.class);
        parameterContainer.setParA(parameterA);
        parameterContainer.setParB(parameterB);
        /*
         * spawn a couple of additional threads here which
         * need to get access to the ParameterContainer.
         */ 
    }
}

0 个答案:

没有答案