我的目标是创建 Java EE Web 服务,它将同时处理数千个(或将来更多)请求,并且必须将请求中的数据存储在列表或类似结构中。我想将请求中的对象存储在内存中,但这不是强制性的。将从每个请求中提取一些对象并将其添加到选定的数据结构中。 Web 服务将有两个操作:添加到结构和从结构中删除。删除请求将包含对象实例变量的值。可能它是唯一的 ID 或其他一个或多个实例变量。始终会删除一个对象(如果请求无效,则删除 0 个对象)。具有相同实例变量值的对象将被删除。
我的想法是使用两个EJB。首先是 @Stateless 并公开为 Web 服务。它将从请求中提取对象并调用第二个 EJB 以从数据结构中添加或删除请求的对象。第二个 EJB 是 @Singleton,并且具有从请求中提取的对象的实例变量 ArrayList<>。正如我所说,它根本不必是 ArrayList 或 List。
我也考虑过使用一个 EJB,它必须是 @WebService @Singleton,但文档说这种组合是“可能的,但是……本规范未定义。”
最佳答案
Arjan,您的要求不完全清楚。 假设您正在构建一个高负载应用程序 > 每秒 1000 个请求,我会这样做:
Servlet 处理
- 将“对象”数据容器分离到每个用户的 http session 中(如果 http session 可用)
- 将同步列表添加到您的 http session 中,并根据每个请求对同步私有(private)列表执行操作,并将 Web 客户端详细信息添加到此 http session 存储列表中
- 将 httpssession 列表的引用添加到接下来提到的 SingletonEJB
单例 EJB
- 创建单例 EJB
- 为您提取/过滤/处理的 YourObjectType 类型的对象添加列表字段
- 为基于 HTTP-Session 的未过滤但同步列表的引用添加第二个集合
TimerEJB
- 创建一个定时器 EJB 定期运行,例如每秒
- 此函数将遍历 refCol 中的所有引用列表,并提取和过滤所需的对象,并确保清理基于 http session 的列表。
解决方案的好处:
- 将用户的内存负载推送到其 session
- 不要在非常高的负载下陷入同步/互斥问题,因为您在 Singleton bean 中的中央过滤列表上仅使用计时器EJB 进行很短的操作。
- 只要您的 session 保持较小规模,您就可以长期扩展
- 可能用于过滤的 CPU 密集型解决方案和用于保留已过滤对象的 IO 密集型解决方案不在客户端请求范围内,客户端不会面临性能问题。
- 计时器时间表可根据您的需要进行更改
缺点:
- 复杂性稍高
- 您必须清除 refColl 中对已关闭 http session 列表的引用。通过在复合类中提供 session 和对 session 列表的引用或通过任何其他自定义解决方案。如果您不进行清理,您的堆将因保存对已“终止”http session 列表的引用而变得臃肿。
关于java - 设计 Web 服务的最佳方法,必须将请求中的数据存储在列表或类似结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28096166/