我的应用程序使用Spring DefaultMessageListenerContainer来处理传入的消息.应用程序的主要方法已经注册了一个关闭钩子.
问题是:强制应用程序上下文关闭的最佳方法是什么?
如果我RuntimeException在消息监听器中抛出一个,它由容器处理,而不是传递.调用System.exit是否可以接受?我是否会将其传递ApplicationContext给需要关闭的每个班级,以便我可以打电话close()给它?
我们总是习惯将应用程序配置放入环境文件中.这对生产管理没有好处,所以现在我们通过初始化程序加载它:
# myinitializer.rb
ApplicationConfig = YAML.load_file("#{Rails.root}/config/application/default.yml").symbolize_keys()
Run Code Online (Sandbox Code Playgroud)
一旦我们开始访问配置ApplicationConfig,应用程序测试性能就会变得更糟.一个rspec套件从4秒减少到30秒.
在我们的应用程序控制器中,我们需要使用a执行一些操作before_filter,其工作方式如下:
before_filter :extra_control
def extra_control
if ApplicationConfig.some_flag
...
end
end
Run Code Online (Sandbox Code Playgroud)
声明一个指向ApplicationConfig完全恢复性能的变量:
config = ApplicationConfig
def extra_control
if config.some_flag
...
end
end
Run Code Online (Sandbox Code Playgroud)
为什么?为什么通过全局变量访问它会破坏性能?我们在视图和其他控制器的整个代码库中执行此操作.我们是否需要以不同方式执行此操作,例如将实例变量注入所有控制器?
编辑:我们确实验证了从YAML加载配置的代码无论哪种方式都被调用一次,因此重复加载似乎不是根本原因.
编辑:事实证明这是一个由设置变量引起的错误,该变量被加载为字符串而不是布尔值,导致应用程序进入测试睡眠模式:(对不起,感谢您的尝试.我生命的3天我永远不会回来!
对于grails应用程序,我需要找到一个对象列表,其中"attr"是动态字符串列表中的一个.实际的HQL查询更复杂,但我需要帮助的是这个:
def result = MyObject.executeQuery("select o from MyObject as o where o.attr in :list",
[list: aListOfStrings])
Run Code Online (Sandbox Code Playgroud)
这显然不是正确的语法,Grails将它作为"意外令牌"抛回给我,作为:list参数.
这在HQL中是否可行?我并不特别想在代码库的这一部分使用Criteria.