Java 设计web服务的最佳方法,它必须将来自请求的数据存储在列表或类似结构中
我的目标是创建JavaEEWeb服务,它将同时接受数千个(将来甚至更多)请求,并且必须以列表或类似结构存储来自请求的数据。我想将请求中的对象存储在内存中,但这不是必须的。将从每个请求中提取一些对象,并将其添加到选定的数据结构中。Web服务将有两个操作:添加到结构和从结构中删除。删除请求将包含对象实例变量的值。可能是唯一ID或其他一个或多个实例变量。将始终有一个对象要删除(如果请求无效,则为0)。具有相等实例变量值的对象将被删除 我的想法是使用两个EJB。首先是@Stateless,并作为web服务公开。它将从请求中提取对象,并调用第二个EJB从数据结构中添加或删除请求的对象。第二个EJB将是@Singleton,并将具有从请求中提取的对象的实例变量ArrayList。正如我所说,它根本不必是ArrayList或ListJava 设计web服务的最佳方法,它必须将来自请求的数据存储在列表或类似结构中,java,web-services,jakarta-ee,ejb,jax-ws,Java,Web Services,Jakarta Ee,Ejb,Jax Ws,我的目标是创建JavaEEWeb服务,它将同时接受数千个(将来甚至更多)请求,并且必须以列表或类似结构存储来自请求的数据。我想将请求中的对象存储在内存中,但这不是必须的。将从每个请求中提取一些对象,并将其添加到选定的数据结构中。Web服务将有两个操作:添加到结构和从结构中删除。删除请求将包含对象实例变量的值。可能是唯一ID或其他一个或多个实例变量。将始终有一个对象要删除(如果请求无效,则为0)。具有相等实例变量值的对象将被删除 我的想法是使用两个EJB。首先是@Stateless,并作为web服
我还考虑过使用一个EJB,它必须是@WebService@Singleton,但文档中说这种组合是“可能的,但……不是由本规范定义的。”您不能在WS上使用@Singleton,因为容器可能会初始化多个实例来处理繁重的请求 您的@Singleton bean无法使用ArrayList,因为将有并发访问。您应该改用ConcurrentLinkedQueue。 如何识别删除操作的请求?也许ConcurrentHashMap更适合它
除非将请求转储到数据库或文件中,否则如果您希望“将来有数千个(或更多)”的话,您迟早会耗尽内存。使用JPA的DB将是最简单的,您可以在WS和请求对象上使用很少的注释来实现它 您不能在WS上使用@Singleton,因为容器可能初始化多个实例来处理繁重的请求 您的@Singleton bean无法使用ArrayList,因为将有并发访问。您应该改用ConcurrentLinkedQueue。 如何识别删除操作的请求?也许ConcurrentHashMap更适合它
除非将请求转储到数据库或文件中,否则如果您希望“将来有数千个(或更多)”的话,您迟早会耗尽内存。使用JPA的DB将是最简单的,您可以在WS和请求对象上使用很少的注释来实现它 Arjan,您的要求还不完全清楚。 假设您正在构建一个每秒大于1000个请求的高负载应用程序,我会: Servlet处理
- 将“对象”数据容器分离到每个用户的http会话中(如果http会话可用)
- 将同步列表添加到http会话中,并在每次请求时对同步私有列表执行操作,并将web客户端详细信息添加到此http会话存储列表中
- 将httpsession列表的引用添加到下面提到的SingletonEJB
- 创建一个单例EJB
- 为您的ObjectType类型的提取/过滤/处理对象添加列表字段
- 为基于HTTP会话且未筛选但已同步的列表的引用添加第二个集合
- 创建一个定时EJB以定期运行,例如每秒运行一次
- 此函数将遍历refCol中的所有引用列表,提取并过滤所需的对象,并确保清理基于http会话的列表
- 将用户的mem负载推送到他们的会话中
- 不要在很高的负载下处理同步/互斥问题,因为在Singleton bean的一个中心和过滤列表中,只有很短的时间使用timerEJB进行操作
- 只要会话保持较小,您就可以长期扩展
- 用于筛选的CPU密集型解决方案和用于持久化筛选对象的IO密集型解决方案在客户端请求之外,客户端将不会面临性能问题
- 计时器时间表可根据您的需要进行更改
- 稍微复杂一点
- 您必须清除refColl中对已关闭http会话列表的引用。通过在复合类中提供会话和对会话列表的引用,或者通过任何其他自定义解决方案。如果不进行清理,堆将因持有对已“终止”http会话列表的引用而膨胀
- 将“对象”数据容器分离到每个用户的http会话中(如果http会话可用)
- 将同步列表添加到http会话中,并在每次请求时对同步私有列表执行操作,并将web客户端详细信息添加到此http会话存储列表中
- 将httpsession列表的引用添加到下面提到的SingletonEJB
- 创建一个单例EJB
- 为您的ObjectType类型的提取/过滤/处理对象添加列表字段
- 为基于HTTP会话且未筛选但已同步的列表的引用添加第二个集合
- 创建一个定时EJB以定期运行,例如每秒运行一次
- 此函数将遍历refCol中的所有引用列表,提取并过滤所需的对象,并确保对http会话b进行清理
- Arjan,您的要求还不完全清楚。
假设您正在构建一个每秒大于1000个请求的高负载应用程序,我会:
Servlet处理