我面临着一个在tomcat中托管的grails(1.3.7)应用程序的奇怪问题。
当应用程序连续使用时,应用程序会在某个时间点冻结(挂起状态)。在追踪问题的同时,我发现只是在冻结时,一个带零参数的函数(例如,getLinceneInfo()是控制器代码的一部分)被随机调用并且永远不会返回。在控制器代码中有三个这样的函数,每次我改变这些函数以至少一个伪参数调用,这个问题表现在没有任何参数()的函数上。一旦所有3个函数都被更改为传递参数,此问题就不再发生了。
有人可以对这种随机行为有所了解吗?
此致 里诺
答案 0 :(得分:0)
在2.0之前,所有控制器操作都是关闭的。他们仍然受到支持,但现在首选方法。要发现应被视为操作的闭包,将实例化控制器类并调用getter以确定其返回类型。这是因为每当Groovy类中的属性看起来像
时def foo = ...
Groovy编译器会将其转换为私有字段,并添加getter和setter,在本例中为Object getFoo() { ... }
和void setFoo(Object foo) { ... }
。如果你已经有这些方法中的一种或两种,它们将不会被覆盖。这是属性在域类,标记库和控制器中的工作方式。由于闭包是用def
定义的,所以无法知道它是Closure,String还是其他什么,所以需要调用getter。
此处最简单的解决方法是将方法名称更改为不像getter。一个看起来像吸气剂的常见模式是将其更改为licenceInfo()
。