java - 设计 Web 服务的最佳方法,必须将请求中的数据存储在列表或类似结构中

标签 java web-services jakarta-ee ejb jax-ws

我的目标是创建 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/

相关文章:

java - 正则表达式捕获重复内的组

java - Corba 序列<octet> 比使用套接字慢很多

web-services - 使用 RDBMS 数据为 SoapUI 或类似的测试工具提供动力

c# - 在azure虚拟机上部署基于sql server的web服务

java - 使用什么注释来创建仅在服务器启动时创建一次的 Web 服务?

java - 如何将 "export"映射作为 Java EE 上的网站参数

java - BaseAdapter 内存不足错误

java - 如何将函数作为参数从java传递给kotlin方法?

xml - 不带参数的 getter 的 WSDL 类型

Java EE 和 Glassfish