javaee中持续运行的服务

javaee中持续运行的服务,java,multithreading,jakarta-ee,Java,Multithreading,Jakarta Ee,如何在JavaEE中实现持续运行的服务 我想做的是: User1连接到服务池;等待响应 User2连接到同一服务池;等待响应 服务器对服务池中的所有用户执行任务(匹配用户) 一旦匹配了相应的用户,服务器就会将响应返回给相应的用户;如果User1与User2匹配,则User1接收User2作为响应,User2接收User1 我不是问如何执行任务(匹配)。我想问的是,只要池中有用户,如何让服务器服务运行 在JavaEE中,似乎没有独立运行的方法支持。我能想到的只有: 独立线程上的无限循环 定时

如何在JavaEE中实现持续运行的服务

我想做的是:

  • User1连接到服务池;等待响应
  • User2连接到同一服务池;等待响应
  • 服务器对服务池中的所有用户执行任务(匹配用户)
  • 一旦匹配了相应的用户,服务器就会将响应返回给相应的用户;如果User1与User2匹配,则User1接收User2作为响应,User2接收User1
我不是问如何执行任务(匹配)。我想问的是,只要池中有用户,如何让服务器服务运行

在JavaEE中,似乎没有独立运行的方法支持。我能想到的只有:

  • 独立线程上的无限循环
  • 定时服务

我想知道是否有其他/更好的方法

您发现了两个不同的问题:

  • 您希望不同的会话相互交互
  • 您希望服务器在与用户匹配后发送其响应
  • 对于第一部分,您可以在ServletContext中放置一个专门的bean或对象,会话将在其中注册其用户,并从中获得匹配的用户。如果希望从那时起允许双向交换,可以使用某种类型的缓冲区对,其中一个会话写入另一个会话读取。您还应该使用SessionListener在会话关闭后立即注销会话


    对于第二部分,您必须意识到,您不能希望HTTP连接能够在您需要的时候保持多久。即使服务器和客户端都没有短暂的超时,您也可以通过任何其他网络设备(代理、路由器等)关闭它,而无需另行通知。我认为,最可靠的方法是让页面通过javascript、HTTP刷新头或
    标记自动刷新自己。

    在后台运行进程,实际上你是对的。可以使用无限循环或计时器服务。再看看石英。您只需要在某种线程安全的集合中注册用户


    对于实时更新,您无法确保HTTP请求将等待足够长的时间。可能只是超时。您需要使用WebSocket或Comed来抽象发布/订阅频道。您应该使用接受异步HTTP请求的Java EE服务器(即支持Servlet 3)

    我认为只要应用程序服务器处于活动状态,标准控制器就会侦听HTTP请求。您是说
    频道
    订阅
    ?对,只要应用程序处于活动状态,Servlet本身就会存在。但这对所问的问题有什么帮助呢?我需要一个独立的常数方法。不能让每个会话都启动一个新线程,让一个线程具有无限循环的效率有多高?@ControlAltDel我不确定。我想像一个EJB方法,执行一个任务和会话连接到等待他们的个人响应。考虑使用JMS队列(关于计时器服务),如果在新的定时方法调用应该发生时,对方法的先前调用仍在执行,这个新调用是等待还是在另一个线程上执行?只需定期运行服务。如果您提供了一些用例的背景,我们可以尝试遵循一个场景。