Grails 2.5.1 应用程序偶尔会丢失上下文根

Grails 2.5.1 application sporadically loses context root

我们有一些应用程序部署到同一个 tomcat 服务器(目前正在升级到 grails 3,所以这可能会在接下来的几个月内成为 OBE,但它已经困扰了我们很长一段时间现在)并且其中两个应用程序偶尔会丢失它们的相对上下文根路径。

假设我们有 "app1" 和 "app2" 部署到 server:port/app1server:port/app2

app1 工作正常,但 app2 有时(大约 20% 的时间,可能)部署和所有 <g:link/> links(或任何其他生成的 links,例如资产位置)相对于服务器根目录生成...应用程序正确部署在 /app2 下,因此 links 指向错误位置。

例如,<g:link controller='hello' action='index'/> 将生成 link 作为 /hello/index 而不是 /app2/hello/index

我不知道 post 的相关代码是什么,我们将其与我们的其他应用程序进行了比较,发现表现出这种行为的两个应用程序没有明显不同。但只有这两个(一打中的)应用程序以这种方式中断。

任何关于可能导致此问题的原因或在哪里查看的想法都将不胜感激。

编辑:正在使用的插件:

compile "org.springframework.boot:spring-boot-starter-logging"
compile "org.springframework.boot:spring-boot-autoconfigure"
compile "org.grails:grails-core"
compile "org.springframework.boot:spring-boot-starter-actuator"
provided "org.springframework.boot:spring-boot-starter-tomcat"
compile "org.grails:grails-dependencies"
compile "org.grails:grails-web-boot"
compile 'org.grails.plugins:cache:4.0.0.M2'
compile 'org.grails.plugins:cache-ehcache:3.0.0.M1'
compile "org.grails.plugins:scaffolding"
compile "org.grails.plugins:hibernate4"
compile "org.hibernate:hibernate-core:4.3.10.Final"
compile "org.hibernate:hibernate-ehcache:4.3.10.Final"
console "org.grails:grails-console"
profile "org.grails.profiles:web"
runtime "com.bertramlabs.plugins:asset-pipeline-grails:2.14.1"
runtime "com.h2database:h2"
testCompile "org.grails:grails-plugin-testing"
testCompile "org.grails.plugins:geb"
testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1"
testRuntime "net.sourceforge.htmlunit:htmlunit:2.18"

已解决(大概)

终于找到原因了。 grailsLinkGenerator (DefaultLinkGenerator class) 要么丢失 contextPath,要么在启动时未正确设置。这会导致所有使用 link 生成器单例生成的 links(这是大多数,但显然不是全部)在服务器根目录中生成。

我们仍在努力确定是否可以在 BootStrap 中 运行 并推迟到服务器启动完成,但目前,作为一种解决方法,我们已经添加了一个不受保护的控制器操作来重置它,这似乎解决了问题(直到下次服务器重新启动)。

def resetContextPath() {
  grailsLinkGenerator.contextPath = grailsApplication.config.getProperty("server.contextPath")

  if (grailsLinkGenerator instanceof CachingLinkGenerator) {
    grailsLinkGenerator.clearCache()
  }
}

仍然不知道为什么它只发生在某些服务器上的某些应用程序上(可能是应用程序启动的时间),但这至少让我们无需重新启动即可解决问题。