节奏:根据请求在现有引擎实例上创建新引擎或设置 Language/Locale

Rythm: create new engine or set Language/Locale on existing engine instance per request

Rythm 可以作为单例使用,也可以实例化为普通对象。 目前,我在 Servlet Init() 方法的 webapp 中实例化了一次。 (这与使用单例几乎相同,因为我只创建了一次)

现在我需要为我的站点添加 i18n 支持,并且需要在呈现之前动态设置语言。

我可以这样做:

engine.setLocale(userLocale);
engine.render(template,arguments);

我假设如果我使用单例(或在 servlet 中创建的单个实例),那么我可能会在两个语句之间出现竞争条件。

  1. 这是正确的还是没有竞争条件?
  2. 我应该为每个请求创建一个 Rythm 实例吗?
  3. 是否有另一种方法可以在不更改引擎状态的情况下更改每次渲染的语言?

首先在最新版本的节奏中,你应该调用engine.prepare(Locale),而不是engine.setLocale(Locale)

现在回答你的问题:

  1. Is this correct or is there no race condition?

它不会导致竞争条件,因为在代码中它使用 ThreadLocal 来存储渲染设置

  1. Should I create a Rythm instance for each request?

肯定会不会

  1. Is there another way to change the language for each rendering without changing the engine state?

语言和区域设置 不是 引擎级别状态,它们是 每个请求 状态。但是 默认 语言和语言环境可以在引擎级别配置