Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设计web服务的最佳方法,它必须将来自请求的数据存储在列表或类似结构中_Java_Web Services_Jakarta Ee_Ejb_Jax Ws - Fatal编程技术网

Java 设计web服务的最佳方法,它必须将来自请求的数据存储在列表或类似结构中

Java 设计web服务的最佳方法,它必须将来自请求的数据存储在列表或类似结构中,java,web-services,jakarta-ee,ejb,jax-ws,Java,Web Services,Jakarta Ee,Ejb,Jax Ws,我的目标是创建JavaEEWeb服务,它将同时接受数千个(将来甚至更多)请求,并且必须以列表或类似结构存储来自请求的数据。我想将请求中的对象存储在内存中,但这不是必须的。将从每个请求中提取一些对象,并将其添加到选定的数据结构中。Web服务将有两个操作:添加到结构和从结构中删除。删除请求将包含对象实例变量的值。可能是唯一ID或其他一个或多个实例变量。将始终有一个对象要删除(如果请求无效,则为0)。具有相等实例变量值的对象将被删除 我的想法是使用两个EJB。首先是@Stateless,并作为web服

我的目标是创建JavaEEWeb服务,它将同时接受数千个(将来甚至更多)请求,并且必须以列表或类似结构存储来自请求的数据。我想将请求中的对象存储在内存中,但这不是必须的。将从每个请求中提取一些对象,并将其添加到选定的数据结构中。Web服务将有两个操作:添加到结构和从结构中删除。删除请求将包含对象实例变量的值。可能是唯一ID或其他一个或多个实例变量。将始终有一个对象要删除(如果请求无效,则为0)。具有相等实例变量值的对象将被删除

我的想法是使用两个EJB。首先是@Stateless,并作为web服务公开。它将从请求中提取对象,并调用第二个EJB从数据结构中添加或删除请求的对象。第二个EJB将是@Singleton,并将具有从请求中提取的对象的实例变量ArrayList。正如我所说,它根本不必是ArrayList或List


我还考虑过使用一个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

  • 创建一个单例EJB
  • 为您的ObjectType类型的提取/过滤/处理对象添加列表字段
  • 为基于HTTP会话且未筛选但已同步的列表的引用添加第二个集合
TimerEJB

  • 创建一个定时EJB以定期运行,例如每秒运行一次
  • 此函数将遍历refCol中的所有引用列表,提取并过滤所需的对象,并确保清理基于http会话的列表
解决方案的好处:

  • 将用户的mem负载推送到他们的会话中
  • 不要在很高的负载下处理同步/互斥问题,因为在Singleton bean的一个中心和过滤列表中,只有很短的时间使用timerEJB进行操作
  • 只要会话保持较小,您就可以长期扩展
  • 用于筛选的CPU密集型解决方案和用于持久化筛选对象的IO密集型解决方案在客户端请求之外,客户端将不会面临性能问题
  • 计时器时间表可根据您的需要进行更改
缺点:

  • 稍微复杂一点
  • 您必须清除refColl中对已关闭http会话列表的引用。通过在复合类中提供会话和对会话列表的引用,或者通过任何其他自定义解决方案。如果不进行清理,堆将因持有对已“终止”http会话列表的引用而膨胀

    • Arjan,您的要求还不完全清楚。 假设您正在构建一个每秒大于1000个请求的高负载应用程序,我会:

      Servlet处理

      • 将“对象”数据容器分离到每个用户的http会话中(如果http会话可用)
      • 将同步列表添加到http会话中,并在每次请求时对同步私有列表执行操作,并将web客户端详细信息添加到此http会话存储列表中
      • 将httpsession列表的引用添加到下面提到的SingletonEJB
      单例EJB

      • 创建一个单例EJB
      • 为您的ObjectType类型的提取/过滤/处理对象添加列表字段
      • 为基于HTTP会话且未筛选但已同步的列表的引用添加第二个集合
      TimerEJB

      • 创建一个定时EJB以定期运行,例如每秒运行一次
      • 此函数将遍历refCol中的所有引用列表,提取并过滤所需的对象,并确保对http会话b进行清理