【问题标题】:how to implement asynchronous work in java如何在java中实现异步工作
【发布时间】:2013-10-04 19:17:33
【问题描述】:

我有一个处理一些业务数据并且必须返回响应的 java 程序。但作为备份这些数据的一部分,我想实现另一种方法,它将数据传递给该方法并异步备份,以便客户端不必等待该备份操作完成。有人可以提出更好的方法来实现这一点吗?我们达到了超过 100 个请求/秒,并且所有处理的数据也需要备份。

【问题讨论】:

  • 如果你使用的是 Spring 3,你可以在你的异步操作上使用 @Async 注解。有关一些想法,请参阅stackoverflow.com/questions/17167020/…
  • 请提供更多详细信息,如软件版本(java、spring 等)。这将有助于准确地回答您的问题。

标签: java spring


【解决方案1】:

我猜你可以使用java.util.concurrent.ExecutorService

【讨论】:

  • executorService 的问题是关闭,因为已处理请求的主线程已返回响应。并且执行程序仍在执行后台工作,一旦完成,我想关闭它以便没有线程处于活动状态,因为我认为这可能会导致 prod 应用程序出现一些问题。我在这种情况下正确吗?
【解决方案2】:

您应该使用java.util.concurrent.ExecutorService 来实现此类功能。它可以让您更好地控制线程池大小以及超时和等待等其他方面。

【讨论】:

    【解决方案3】:

    Spring 3.0 @Async 允许您异步运行任务。点击此链接了解更多关于 Spring Asynch 任务使用的信息:

    http://java-success.blogspot.in/2013/05/asynchronous-processiong-with-spring.html

    【讨论】:

      【解决方案4】:

      听起来您需要认真考虑使用一些消息队列技术,例如 JMS (Hornet) 或 AMQP (RabbitMQ)。

      @Async 非常适合做小事,但它不能扩展,普通的 ExecutorService 也不能。更不用说您的问题听起来更像是消息问题,而不是简单的任务执行(备份和客户端通知)。 MQ 理论/实践/实现需要一些阅读,所以我建议您查看 Spring AMQP/JMS 和通用消息队列文档。

      在通知客户方面,请查看new spring mvc DeferredResult。

      【讨论】:

        猜你喜欢
        • 2018-06-10
        • 2013-04-27
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 2020-11-02
        • 2018-05-07
        • 2011-02-01
        相关资源
        最近更新 更多