Создание длительного процесса или службы 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, которая позволит ему работать «вечно»?


person D-Dᴙum    schedule 25.01.2014    source источник


Ответы (1)


Потоки таймера - это поток демона. Вместо петли используйте вот такую ​​защелку.

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