在grails中远程调用action
Posted 曾想技术改变世界,不料世界改变了我们
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在grails中远程调用action相关的知识,希望对你有一定的参考价值。
在进行类似批处理的程序时,如果在一个action中需要保存很多记录数,这会导致grails中的数据库session超过负荷,从而导致OOM。
因为这个情况的发生是由于在一次请求中,对数据进行的修改都保存在这个请求的数据库session中,等这次请求结束后才会释放这个数据库session,这样当本次请求中对数据修改的记录数太多会导致OOM。
我们使用的是mongodb数据库,而且使用的是grails mongodb plugin,即便我们使用这个plugin中的mongodb底层链接进行操作,还是依然发生了OOM。
因此我们想能够使每次请求中只保留少量的修改数据在数据库session中,这样相当于对于具体数据的修改编写在另一个action中。示例代码如下:
def updateData(){
println "classId:${params.classId} usersId:${params.usersId}"
render "ok"
}
调用这个action的方法为:
println dataService.remoteCall(request, g.createLink(action: ‘updateData‘, params: [classId:"test1", usersId:‘usersIdxxx‘]))
这里的实现关键是dataService.remoteCall的函数实现,具体如下:
/**
* 得到协议和主机IP的url,最后不带/
* 比如:
* http://localhost:9090/blog/bkoff/testCaculateUserExedCount
* 返回:http://localhost:9090
* @param request
* @return
*/
private String getHostUrl(request){
String requestUrl = request.requestURL
String seperator = "://"
int index = requestUrl.indexOf("://")
index = requestUrl.indexOf("/", index + seperator.length())
return requestUrl.substring(0, index)
}
/**
* 远程调用某方法,其中actionUrl用createLink方式就可以创建
* @param request
* @param actionUrl
* @return
*/
def String remoteCall(request, actionUrl){
def hostUrl = getHostUrl(request)
def url = new URL(hostUrl + actionUrl)
return url.text
}
以上是关于在grails中远程调用action的主要内容,如果未能解决你的问题,请参考以下文章
Grails 远程函数 onSuccess 与 onComplete
Grails 根据环境将 Service 注入到 Controller
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段