2012-08-28 120 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/ –