2012-08-28 84 views
1

在使用Spring框架的Web应用程序中解决UI消息并提供内化支持的方式有哪些?Spring国际化支持

我们使用属性文件和ResourceBundleMessageSource来解析Spring中的消息。 Spring的实现会在我们的应用程序中导致高CPU使用率。 ResourceBundleMessageSource实现有两个问题。

  1. 锁定争用 - getResourceBundle()和getMessageFormat()都是同步的。
  2. MissingResourceException - 解析消息涉及遍历应用程序中定义的所有资源包并调用bundle.getString(key)。如果未找到密钥,bundle.getString(key)方法调用将引发MissingResourceException。搜索密钥,直到找到给定密钥的消息。由于异常构建是一个缓慢的过程,可能会吃掉CPU(这是我在负载测试中观察到的),这看起来像是一个瓶颈。

尽管上述两个问题(通过扩展类和重写行为)都有解决方法,但我想知道Spring框架中是否还有其他方法为Web应用程序提供国际化支持。

在此先感谢

回答

2

可以使用ReloadableResourceBundleMessageSource代替。它提供了一些内部缓存。

如果这不起作用,我会建议实施自己的MessageSource(这是非常简单的)。 Spring提供了AbstractMessageSource,这可能有助于开始。

从那里,你可以实现一些缓存。您的本地化可能不会经常更新。

您可以在Spring 3.1

spring 3.1 @Cacheable example

读到这里使用新的可缓存注释我已经在允许管理员覆盖语言环境中的数据库应用程序的成功已经做到了这一点。然而,你的具体实施显然会有很大的不同。

+0

你说得对。实现一个自定义的MessageSource就是解决这个问题的方法。自定义实现可以在启动时解析预先配置的区域设置的消息。 ReloadableResourceBundleMessageSource不会帮助,因为它不会解决我上面提到的两个问题。 –

+0

我实现了两个MessageSource实现。通过解决方法解决上述两个问题的解决方案,以及解析消息并将其缓存以供将来参考(资源包和消息格式实例未缓存)的另一个实现。以下是第一个实现的外观 - http://amitstechblog.wordpress.com/2012/09/17/issues-with-springs-resourcebundlemessagesource/ –