使用Grails 3将长时间运行进程的响应返回给客户端

时间:2018-03-09 22:57:33

标签: grails websocket grails-plugin java-websocket grails3

我有一个Grails 3 Web应用程序。客户端向我的应用程序发送请求后,启动一个长时间运行的进程,进程完成可能需要几秒钟或几个小时。我不想阻止客户端等待响应。因此,我为该进程启动一个新线程,但是当进程执行完成时,我无法更新客户端以了解该进程已完成。经过一些搜索,我遇到了可能是解决方案的WebSockets,或者可能存在更好的解决方案。

我想知道这个问题可能有什么好的解决方案(grails插件)。

谢谢。

2 个答案:

答案 0 :(得分:1)

  

......流程完成可能需要几秒钟或几个小时。

在启动请求后数小时向浏览器发送响应容易出现一些挑战,但假设您已经完成了所有这些工作,而不是自己启动一个线程,则应该在框架中使用异步支持。 https://async.grails.org/latest/guide/index.html提供了大量信息。详细信息将具体取决于您的长时间运行过程,但您可能会对“服务器已发送事件”部分感兴趣。

我希望有所帮助。

答案 1 :(得分:0)

您可以使用构建在RxJava,GPars和Reactor之上的Async features of Grails

示例:

import grails.async.Promise
import static grails.async.Promises.*

def longRunningTask() {
        Promise p = task {
            // Long running task
            return "Long running task completed"
        }
        p.onError { Throwable err ->
            println "An error occured ${err.message}"
        }
        p.onComplete { result ->
            //notify/update the client to know that the process has completed
            println "Promise returned: $result"
        }
    }

您也可以参考Event Publishing