我想创建一个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的配置,它将允许它永远运行。?
答案 0 :(得分:1)
计时器线程是一个守护程序线程。 而不是循环使用像这样的锁存器。
final CountDownLatch shutdownLatch = new CountDownLatch(1);
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
shutdownLatch.countDown();
}
});
shutdownLatch.await();