如何在JavaEE中实现持续运行的流程

如何在JavaEE中实现持续运行的流程,java,jakarta-ee,ejb,jboss7.x,Java,Jakarta Ee,Ejb,Jboss7.x,您建议如何在JavaEE中实现以下内容: 我需要在appserver中有一个后台进程(我想是一个有状态的会话bean),它可以不断监视“某物”,如果某些条件适用,它会对数据库进行操作 最重要的是,它必须由不同的客户端远程操作 因此,基本上,我需要一个持续运行的进程,保持其状态,并对许多远程客户端的方法调用开放 因为我是JavaEE新手,所以我有点困惑应该使用哪种方法/技术。非常感谢您的帮助。Java EE是解决方案。您需要遵循以下步骤: 构建一个Java EE应用程序,一个包含EJB的jar:

您建议如何在JavaEE中实现以下内容:

  • 我需要在appserver中有一个后台进程(我想是一个有状态的会话bean),它可以不断监视“某物”,如果某些条件适用,它会对数据库进行操作

  • 最重要的是,它必须由不同的客户端远程操作

  • 因此,基本上,我需要一个持续运行的进程,保持其状态,并对许多远程客户端的方法调用开放


    因为我是JavaEE新手,所以我有点困惑应该使用哪种方法/技术。非常感谢您的帮助。

    Java EE是解决方案。您需要遵循以下步骤:

  • 构建一个Java EE应用程序,一个包含EJB的jar:

    1.1您将需要一个IDE:EclipseJuno是我的最爱, 1.2网络上有许多图图。搜索EJB3,您会发现

  • 有一个应用服务器来运行EJB。JBoss是一个不错的选择,Glassfish是另一个不错的选择。安装了JBoss和JBossTools插件for Eclipse后,您将能够快速构建和运行一个基本应用程序
  • 编辑:一个完整的计时器EJB类(如果需要,可以自动重新加载)


    我希望这会有所帮助。

    您可以将无状态会话或单例bean与EJB计时器和计时器服务结合使用。bean将提供远程客户端用来控制后台进程的接口。计时器服务将定期回调bean上的方法以验证条件。计时器由EJB容器自动持久化,因此当您的bean客户机断开连接时,它们将完成它们的工作

    这是一张草图:

    @Singleton
    ...
    public TimerMangerbean implements TimerManager {
    
       @Resource
       private TimerService timerService;
    
       public void startMonitoring() {
          //start in 5 sec and timeout every 10 minutes
          Timer timer = timerService.createTimer(5000, 60000, "MyTimer");
       }
    
       public void stopMonitoring() {
          Collection<Timer> timers = timerService.getTimers();
          for(Timer timer : timers) {
             //look for your timer
             if("MyTimer".equals(timer.getInfo())) {
                timer.cancel();break;
             }
          }
       }
    
       //called every 10 minutes
       @Timeout
       public void onTimeout() {
          //verify the condition and do your processing
       }
    }
    
    @Singleton
    ...
    公共TimerManager bean实现TimerManager{
    @资源
    私人TimerService TimerService;
    公共无效开始监视(){
    //5秒后开始,每10分钟超时一次
    Timer Timer=timerService.createTimer(500060000,“MyTimer”);
    }
    公众监察({
    Collection timers=timerService.getTimers();
    用于(计时器:计时器){
    //找一下你的计时器
    如果(“MyTimer.equals(timer.getInfo())){
    timer.cancel();break;
    }
    }
    }
    //每10分钟打一次电话
    @超时
    公共void onTimeout(){
    //验证条件并进行处理
    }
    }
    

    另请参见:

    石英怎么样?请参阅链接

    正如您自己所说,您有两个要求:1)定期执行一些后台工作,2)响应客户请求

    对于1),可以使用
    TimerService
    或使用
    ServletContextListener
    生成线程。第二种方法并不完全符合,但有效。如果您使用计时器,您可以创建一个定期计时器(正如@dcernahoschi所指出的),或者创建一个唯一的计时器来重新安排自己的时间:

    @Timeout
    public void onTimeout() {
         //do something
         // create a new timer
     }
    
    如果您的定期计时器每10秒启动一次,并且您对最后一个表单的处理时间超过10秒,则可能会出现问题。如果处理时间不是固定的,那么拥有一个可以重新安排自己的计时器会更好


    对于2)您可以使用无状态或静态EJB,这正是它们的用途

    是的,我实际上使用JBoss工具运行JBoss7.1.1和EclipseJuno。问题是要使用哪种特定的API,以便进程能够持续运行,例如,在客户端断开连接(SLSB)后不会被破坏。好的,让我们检查一下上面关于在JBoss 7.1.1中实现TimerEJB的完整响应,我很欣赏你的回答,但我希望有一种更基本的方法来实现它,您建议的解决方案看起来更像是一个骗局。是否有另一个更基本的解决方案适用于更广泛的连续过程及其操作问题。不,这不是一个技巧,
    TimerService
    Timer
    (s)是JEE中控制和执行重复过程的标准方法。他们不会把你和特定的问题联系起来。您认为这种方法有哪些局限性?正如您所说的,这个问题似乎是完美的匹配。+1在JavaEE中没有对长时间运行的后台进程的直接支持。相反,它们支持使用
    TimerService
    的周期计时器。
    @Timeout
    public void onTimeout() {
         //do something
         // create a new timer
     }