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

时间:2017-03-28 12:38:19

标签: grails grails3 grails-2.5

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

我们说我们有#app;" app1"和" app2"部署到server:port/app1server:port/app2

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

例如,<g:link controller='hello' action='index'/>会生成/hello/index而不是/app2/hello/index的链接。

我不知道要发布的相关代码是什么,我们已将其与我们的其他应用程序进行比较,并且发现两者中没有显示出明显不同的行为。但只有这两个(十几个)应用程序才会以这种方式破解。

对于可能导致此问题或在何处查看的内容的任何想法都将非常受欢迎。

编辑:正在使用的插件:

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"

1 个答案:

答案 0 :(得分:1)

已解决('ish)

我们终于找到了原因。 grailsLinkGeneratorDefaultLinkGenerator类)正在丢失contextPath或在启动时未正确设置。这将导致使用链接生成器单例生成的所有链接(最多,但显然不是全部)在服务器根目录生成。

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

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

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

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