Grails加载小部件并行

时间:2016-03-10 07:32:12

标签: grails

我的应用程序中有一些小部件。我想在一个页面中加载它们。它总是在按顺序加载时工作,但是失败(抛出异常-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']
   }
}

2 个答案:

答案 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