创建Esper长时间运行的进程或服务

时间:2014-01-25 20:21:28

标签: service daemon esper

我想创建一个Esper引擎长时间运行的进程,但我不确定Esper的线程模型,也不确定我应该实现的模型。天真的我尝试了以下内容:

public class EsperTest {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    //EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
   EPServiceProvider epService = EPServiceProviderManager.getProvider("CoreEngine");
   epService.addServiceStateListener(new EPServiceStateListener() {

       @Override
       public void onEPServiceDestroyRequested(EPServiceProvider epsp) {
           System.out.println("Service destroyed");
       }

       @Override
       public void onEPServiceInitialized(EPServiceProvider epsp) {
           System.out.println("System initialised");
       }
   });

   epService.initialize();
}

}

但代码似乎执行到main()方法的末尾,JVM结束。

参考Esper文档,第14.7节p456:

  

在默认配置中,每个引擎实例都维护一个计时器线程(内部计时器)   在引擎内提供时间或基于计划的处理。默认分辨率   内部定时器工作是100毫秒。可以禁用内部计时器线程   应用程序可以将外部时间事件发送到引擎实例以执行计时器或   按照申请所要求的决议进行预定处理。

因此,我认为通过创建一个引擎实例(“CoreEngine”),至少会创建一个(计时器)线程并假设这不是一个守护程序线程,main()方法将无法完成,但这似乎不是是这样的。

我是否必须在main()中实现我自己的无限循环,或者是否有一个可以提供给Esper的配置,它将允许它永远运行。?

1 个答案:

答案 0 :(得分:1)

计时器线程是一个守护程序线程。 而不是循环使用像这样的锁存器。

final CountDownLatch shutdownLatch = new CountDownLatch(1);
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        shutdownLatch.countDown();
    }
});
shutdownLatch.await();