在Java EE中不断运行服务

时间:2015-03-23 17:23:03

标签: java multithreading java-ee

您如何在Java EE中实现持续运行的服务?

我正在尝试做什么:

  • User1连接到服务池;等待回应。
  • User2连接到同一个服务池;等待回应。
  • 服务器在服务池中的所有用户上执行任务(匹配用户)。
  • 服务器在匹配后将响应返回给相应的用户;如果User1与User2匹配,则User1接收User2作为响应,User2接收User1。

我不是在问如何执行任务(匹配)。只要池中有用户,我问如何运行此服务器服务?

在Java EE中,似乎没有独立运行的方法支持。我唯一能想到的是:

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

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

2 个答案:

答案 0 :(得分:0)

你已经解决了两个不同的问题:

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

    对于第二部分,您必须意识到,只要您需要,您就不能希望HTTP连接能够存在。即使服务器和客户端都没有短暂超时,您也可以通过任何其他可以关闭它的网络设备(代理,路由器......),恕不另行通知。恕我直言,最强大的方法是让页面通过javascript,HTTP刷新标头或<meta http-equiv="refresh">标签自动刷新。

答案 1 :(得分:0)

对于在引擎盖下运行的过程,你实际上是对的。可以使用无限循环或定时服务。看看Quartz吧。您只需要在某种线程安全集合中注册用户。

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