【问题标题】:Spring @Controller which calls an @Async method then calls get() on the returned Future....code smell?Spring @Controller 调用 @Async 方法,然后在返回的 Future 上调用 get() ....代码气味?
【发布时间】:2011-06-23 10:15:39
【问题描述】:

我正在查看一个调用 @Async 方法的 spring @Controller 方法,执行一些“其他事情”,然后在 async 方法调用返回的 Future 上调用 .get()

我可以看到这可以如何改善控制器的响应时间,因为异步方法和“其他东西”都涉及调用 Web 服务,当然,为什么不并行执行多个 ws 调用。但在控制器内部执行此操作对我来说似乎很不寻常。

我一直认为在 Web 应用程序中搞乱线程并不是一个好主意,毕竟所有 Web 应用程序都在服务器上运行,它们对线程有自己的想法(以及用于处理请求的固定线程池)。

这有难闻的气味吗?我什么都不担心吗? spring 将如何处理并发线程,通过在服务器控制之外创建一个新线程或使用服务器池中的另一个线程?

【问题讨论】:

    标签: java multithreading spring-mvc


    【解决方案1】:

    这听起来不是最好的方法。启动异步任务以获取 Future,然后在请求线程中简单地调用 Future.get 意味着您有 两个 线程被占用 - 一个为异步任务工作,一个正在等待完成这项工作。

    如果在异步任务启动和调用get之间的请求线程上发生了什么事,那么我可以理解这一点。否则,最好简单地进行同步调用。

    【讨论】:

    • If something happens on the requesting thread in between the async task starting and the call to get, then I can understand this. - 正如我在问题中提到的,请求线程进行了一些 ws 调用。
    • 对不起,我没听懂。那时你可以很高兴地同时进行这些调用。 Web 应用程序线程并没有什么特别之处,为 IO 密集型工作启动新任务是非常明智的。
    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    相关资源
    最近更新 更多