• 在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
    
        }
  • 相关阅读:
    rpm的制作 spec文件写法
    RPM 打包技术与典型 SPEC 文件分析
    生成器
    闭包
    内置函数
    函数递归
    高阶函数
    匿名函数
    文件操作
    bytes
  • 原文地址:https://www.cnblogs.com/dreampursuer/p/5556884.html
Copyright © 2020-2023  润新知