【问题标题】:Grails - Time consuming processing in the controllerGrails - 控制器中的耗时处理
【发布时间】:2013-07-12 20:00:22
【问题描述】:

我目前有一个控制器进行一些繁重的处理(批量 csv 文件处理 - cvs 文件范围从 150Mb 到 400Mb)。 CSV 文件上传到临时文件位置。处理由服务完成,该服务将文件位置从外部 jar 传递给 API(基本的 java API 调用 - 没有 Web 服务调用或任何东西)。服务方法大约需要 2-3 次才能返回,用户目前必须等待这段时间才能完成处理并在提交表单后加载页面 - 这不是最好的用户体验。

遇到过此类问题的 Grails 用户,此类问题的最佳解决方案是什么?我是 Grails 和 JavaEE 的新手,因此这基本上是一个关于如何构建这样一个系统以及可用于此的库类型的问题。

我已经用谷歌搜索了很多。人们已经用 JMS、RabbitMQ 等作为类似问题的解决方案做出了回应。但这些似乎是用火箭筒代替苍蝇来解决我的菜鸟想法。非常感谢您的建议。

谢谢。

【问题讨论】:

  • heavy lifting processing 不是 Grails 特有的,它取决于你在做什么以及如何做。我确信发布您的代码可以帮助识别潜在的瓶颈。
  • 取决于您正在执行哪种“繁重处理”。详细说明您在控制器和服务类中所做的具体处理。
  • 还添加了处理的详细信息。我已经使用该信息编辑了原始问题。
  • 为什么不直接开始一个新线程?

标签: performance grails grails-controller


【解决方案1】:

如果您希望该方法在不同的线程中执行,您可以在服务方法上使用 Spring @Async 注释。这是我在 Grails 应用程序中采用的方法,非常简单。

这里有一个如何设置的例子: http://tux2323.blogspot.co.uk/2012/05/grails-and-spring-async-annotation.html?m=1

【讨论】:

    【解决方案2】:

    使用quartz 插件...让控制器安排一个即时作业(安排很快,用户将立即得到响应,并且处理将发生在一个石英作业中,该作业在不同的线程中运行)。只需在所有工作完成后通知用户(发送电子邮件或其他)。

    或者,使用executor 插件在新线程中启动工作。 2.3 将有 Async Support 可以在这里提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多