我正在使用部署到Amazon AWS的Grails 2应用程序,该应用程序使用软件负载均衡器(ELB)。我们遇到的问题是,在应用程序完全初始化之前,grails应用程序实例会添加到负载均衡器中。这是resources
插件,专门用于提供javascript,css,图像等静态资源。
负载均衡器向“运行状况检查”URL发出http请求。
GET '/myapp/lbcheck'
LoadBalancerController.groovy:
package myapp
class LoadBalancerController {
def healthService
def healthcheck() {
response.contentType = 'text/plain'
try {
healthService.checkDatabase()
render(status: 200, text: "Up")
}
catch(Exception ex) {
log.error("Error with database healthcheck " + ex)
render(status: 503, text: "Down")
}
}
}
HealthSerivce.groovy
package myapp
import groovy.sql.Sql
class HealthService {
def dataSource
// Either returns true, or throws an Exception
def checkDatabase() {
Sql sql = new Sql(dataSource)
sql.rows("SELECT 429")
sql.close()
return true
}
}
SQL查询显然是不够的。看起来我们需要在框架中检查一些其他类型的属性以确定它已被初始化。
答案 0 :(得分:0)
您可以尝试将healthService
bean中的字段设置为BootStrap.groovy
内的true。我认为这是在Grails完全初始化之后运行的。
package myapp
import groovy.sql.Sql
class HealthService {
def dataSource
def initializationComplete = false
// Either returns true, or throws an Exception
def checkDatabase() {
Sql sql = new Sql(dataSource)
sql.rows("SELECT 429")
sql.close()
return true
}
}
在BootStrap.groovy
内:
class BootStrap {
def healthService
def init = { servletContext ->
healthService.initializationComplete = true
}
}
在LoadBalancerController.groovy
:
def healthcheck() {
response.contentType = 'text/plain'
def healthy = false
try {
healthy = healthService.with {
initializationComplete && checkDatabase()
}
}
catch(Exception ex) {
log.error("Error with database healthcheck " + ex)
}
if (healthy) {
render(status: 200, text: "Up")
} else {
render(status: 503, text: "Down")
}
}