RAP 应用单例

RAP Application Singleton

所以,我一直在阅读有关 RAP 应用程序的信息,我一直想知道我应该如何仅为当前会话创建静态变量(以防不止一个人同时访问该应用程序) .我读过 SingletonUtil。然而,我对此有一些疑问。

1- 我应该为应用程序创建一个 SessionSingleton 吗?或者我应该为我的应用程序中的每个 class 创建一个 SessionSingleton(我知道这听起来很愚蠢,我可能应该只为应用程序创建一个 SessionSingleton,但是......只要确保)。

2- 一旦我创建了这个 Singleton,每个用户(或会话)将只能访问他们的静态字段,对吗?确认他们不会从不同会话的其他静态字段中获取数据是正确的吗? (假设我正在创建一个购物车。如果客户可以从另一个会话中看到购物车,则不可能这样做)。

再次重申Timothy Truckle所说的,你应该尽可能远离单例。

在 Web 应用程序中,静态字段隐式具有应用程序范围,因为每个 Web 应用程序都通过单独的 class 加载程序与其他应用程序隔离。也就是说,您的示例性购物车将在同一 Web 应用程序的所有 sessions/users 之间共享。这通常不是你想要的。

要为每个会话提供购物车,您可以使用 SingletonUtil

要么像这样

SoppingCart cart = SingletonUtil.getSessionInstance( ShoppingCart.class );

SoppingCart cart = SingletonUtil.getUniqueInstance( ShoppingCart.class, session );

第一个变体使用 current UI 会话 - 分配给当前正在执行的请求线程的会话。

第二个变体要求您提供 UI 会话,其单例应为 obtained/created。例如,如果您是 运行 来自从 UI 会话启动的后台线程的代码,请使用此选项。

UISession session = RWT.getUISession( display );

Thread thread = new Thread( this::calcualteItemsInShoppingCart );
thread.start();

void calculateItemsInShopingCart() {
  SoppingCart cart = SingletonUtil.getUniqueInstance( ShoppingCart.class, session );
  // use cart...
}

一般来说,只有在万不得已时才使用 (session/application) 单例。他们迟早会成为负担。努力设计您的代码,以便您可以在入口点创建购物车或示例,并将其传递给需要访问它的代码部分。

请注意,在 RAP 中,每个 servlet 会话可能有多个 UI 个会话(每个浏览器一个 window/tab)。

另请参阅 RAP 文档的 Singletons and Static Fields in RAP 章节。

这是否回答了您的问题?