我基本上试图获取任务在覆盖模板中显示给用户的时间百分比。
我有一个计算过程百分比的服务:
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文件,以便在任务完成时我的视图可以使用最新的属性值不断更新。
答案 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的结果
收到时更新此范围或div id:
所以你需要让你的websocket以一些json格式发送回来,你的前端javascript接收json请求,如果它是一个特定的约定来查找值并更新前端的div。
我在wschat上有一个很好的视频,显示你使用websocket客户端/服务器更新前端。它可能会帮助你更好地理解它
https://www.youtube.com/watch?v=xagMYM9n3l0或https://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如上所述