Grails控制器服务 - 用于属性值的src / groovy poll控制器

时间:2015-03-25 14:49:31

标签: grails websocket

我基本上试图获取任务在覆盖模板中显示给用户的时间百分比。

我有一个计算过程百分比的服务:

def progressCalculation(requestsToSend, requestsSent, requestsFailed, progressPercentage) {

   progressPercentage = 100 / requestsToSend * (requestsSent + requestsFailed)

   progressPercentage = Math.round(progressPercentage * 1) / 1

   MyController upCont = new MyController()
   upCont.progress(progressReport.progressPercentage)
}

继续向控制器发送progressReport.progressPercentage

def progress(progressData) {

    int statusToView = progressData

    if (statusToView % 5==0) {
        [statusToView: statusToView]
    }
}

我创建了一个使用websockets的src / groovy文件:https://github.com/vahidhedayati/grails-websocket-example/blob/master/README.md 我的连接正在运行,但我需要使用正在工作的websocket显示视图的百分比。

@OnMessage
public String handleMessage(String message) {

    message = MyController.progressPercentage

    String replyMessage = "echo "+message
    return replyMessage
}

现在我尝试这样做是将progressPercentage值从控制器返回到src / groovy文件,以便在任务完成时我的视图可以使用最新的属性值不断更新。

2 个答案:

答案 0 :(得分:1)

MyController upCont = new MyController()认真对待?

最好将托管和修改progressPercentage变量的代码移动到服务层,然后使用服务而不是控制器访问它。

myService.progressPercentage而不是MyController.progressPercentage

此外,您必须注入myService,而不是将其实例化为myService = new MyService(),服务是单例,您无法像这样实例化它们。它们由spring container管理。

实际上如果你做MyController upCont = new MyController() 并且您尝试访问upCont的属性,您将收到这条漂亮的错误消息:


java.lang.IllegalStateException:找不到线程绑定请求:您是指实际Web请求之外的请求属性,还是处理最初接收线程之外的请求?如果您实际上是在Web请求中操作并仍然收到此消息,则您的代码可能在DispatcherServlet / DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter来公开当前请求。


答案 1 :(得分:0)

我把这些说明放在一起所以如果我能以任何方式帮助你,请告诉我。

Websockets需要与后端一样多的前端工作。所以要通过websockets获取数据,你需要扩展java脚本,并在后端websocket上扩展,将这些信息发送到java脚本。

所以如果你在前端gsp上有一个按钮而不是一个典型的按钮

你可以看看我已经做过的一些插件。在https://github.com/vahidhedayati/jssh中有一个ping / pong离散地发生,如果用户在taglib中定义websocket连接触发了一个前端javascript接收并发送ping的pong - 他们继续这样做..

这是另一个你可能需要使用的例子:

这是来自websocket的结果

https://github.com/vahidhedayati/grails-jenkins-plugin/blob/master/grails-app/views/jen/_process.gsp#L411

收到时更新此范围或div id:

https://github.com/vahidhedayati/grails-jenkins-plugin/blob/master/grails-app/views/jen/_process.gsp#L213

所以你需要让你的websocket以一些json格式发送回来,你的前端javascript接收json请求,如果它是一个特定的约定来查找值并更新前端的div。

我在wschat上有一个很好的视频,显示你使用websocket客户端/服务器更新前端。它可能会帮助你更好地理解它

https://www.youtube.com/watch?v=xagMYM9n3l0https://www.youtube.com/watch?v=zAySkzNid3E 不确定它是哪一个

E2A:它需要是一项服务:

https://github.com/vahidhedayati/grails-wschat-plugin/blob/master/src/groovy/grails/plugin/wschat/WsChatEndpoint.groovy#L63然后前面的几行在websocket端点中注册这些服务。现在回到代码的历史记录中,或者如果你按照onMessage来验证动作 - 你将需要从前端发送一些东西 - 或者在建立连接时发送消息然后向前端发送消息https://github.com/vahidhedayati/grails-wschat-plugin/blob/75590bf10ea040c18548377dedc716fdab2aa820/src/groovy/grails/plugin/wschat/WsChatEndpoint.groovy#L148。您可以使用userSession直接向发出套接字连接的人发送消息。在网页上使用javascript解析json并更新div如上所述