我的应用程序中有一些小部件。我想在一个页面中加载它们。它总是在按顺序加载时工作,但是失败(抛出异常-java.lang.IllegalStateException-不能请求请求属性 - 请求不再处于活动状态!)并行加载时。我错过了什么吗?有没有其他方法可以并行加载这些?请建议。这是我的代码片段
class TestController {
def widget1() {
render "Widget 1"
}
def widget2() {
render "Widget 2"
}
}
class ManagerController {
def loadSequential(){
def data = [:]
data['view1'] = g.include(action: 'widget1', controller: 'test')
data['view2'] = g.include(action: 'widget2', controller: 'test')
render data['view1']
render data['view2']
}
def loadParallel(){
def data = [:]
PromiseMap pm = new PromiseMap()
pm['view1'] = { g.include(action: 'widget1', controller: 'test') }
pm['view2'] = { g.include(action: 'widget2', controller: 'test') }
def result = pm.get()
render result['view1']
render result['view2']
}
}
答案 0 :(得分:0)
这是关于此事的我的2p。
我们已经非常努力地使Grails渲染页面并行,但我们无法使其工作。在深入挖掘之后,我们发现Grails还没有为这种东西做好准备。它的构建方式是渲染始终是线程独占的。
我说这都是由于org.codehaus.groovy.grails.web.pages.GroovyPageOutputStack
没有为并发访问做好准备。
我会看到这个空间,万一有人设法让它工作。
答案 1 :(得分:0)
试试这个:
import static grails.async.Promises.*
...
def loadParallel() {
task {
def data = [:]
PromiseMap pm = new PromiseMap()
pm['view1'] = { g.include(action: 'widget1', controller: 'test') }
pm['view2'] = { g.include(action: 'widget2', controller: 'test') }
def result = pm.get()
render result['view1'] + result['view2']
}
}
在loadSequential()
示例中,您没有按顺序加载响应,而是将两个视图连接到一个响应中。并行渲染应该是客户端工作。例如,请参阅如何使用jQuery提升does it。