Эспер: StackOverflowError при перемещении паттернов в/из изолированного состояния в эспер

Я хотел инициализировать/обновить состояние шаблона из исторических данных и в некоторых случаях часто получал StackOverflowError. Я написал простой пример для демонстрации:

public class Main {
EsperPatternStackOverflow.zip
    public static void main(String[] args) {
        Configuration configuration = new Configuration();
        configuration.addEventType("TestEvent", TestEvent.class);
        configuration.getEngineDefaults().getViewResources().setShareViews(false);
        configuration.getEngineDefaults().getExecution().setAllowIsolatedService(true);
        EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(configuration);
        epService.initialize();

        EPServiceProviderIsolated isolatedService = epService.getEPServiceIsolated("Isolated");
        EPStatement stmt = isolatedService.getEPAdministrator().createEPL("select * from pattern [every (a=TestEvent -> b=TestEvent(theString=a.theString)) where timer:within(1 day)]", "TestStatement",null);
        int hour_ms = 60*60*1000;
        isolatedService.getEPRuntime().sendEvent(new CurrentTimeEvent(System.currentTimeMillis()- 2*hour_ms));
        isolatedService.getEPRuntime().sendEvent(new TestEvent("str1", 1));
         stmt.addListener((newEvents, oldEvents) -> {
            System.out.println("Fired");
        });
        isolatedService.getEPAdministrator().removeStatement(stmt);
        epService.getEPRuntime().sendEvent(new TestEvent("str1", 3));
    }
}

TestEvent — это простой класс с двумя полями: int theInt, String theString.

Результат:

Exception in thread "main" java.lang.StackOverflowError
        at com.espertech.esper.filter.FilterParamIndexEquals.matchEvent(FilterParamIndexEquals.java:29)
        at com.espertech.esper.filter.FilterHandleSetNode.matchEvent(FilterHandleSetNode.java:99)
        at com.espertech.esper.filter.EventTypeIndex.matchType(EventTypeIndex.java:170)
        at com.espertech.esper.filter.EventTypeIndex.matchEvent(EventTypeIndex.java:108)
        at com.espertech.esper.filter.FilterServiceBase.retryableMatchEvent(FilterServiceBase.java:179)
        at com.espertech.esper.filter.FilterServiceBase.evaluateInternal(FilterServiceBase.java:109)
        at com.espertech.esper.filter.FilterServiceLockCoarse.evaluate(FilterServiceLockCoarse.java:67)
        at com.espertech.esper.core.service.EPRuntimeImpl.handleFilterFault(EPRuntimeImpl.java:1267)
        at com.espertech.esper.core.service.EPRuntimeImpl.processStatementFilterSingle(EPRuntimeImpl.java:1242)
        at com.espertech.esper.core.service.EPRuntimeImpl.handleFilterFault(EPRuntimeImpl.java:1271)
        at com.espertech.esper.core.service.EPRuntimeImpl.processStatementFilterSingle(EPRuntimeImpl.java:1242)
.......................................................................................................................................................................

Также я получил следующее исключение для похожих случаев (отличаются только верхней точкой исключения):

java.lang.StackOverflowError
        at com.espertech.esper.event.bean.CGLibPropertyGetter.get(CGLibPropertyGetter.java:63)
        at com.espertech.esper.filter.FilterParamIndexEquals.matchEvent(FilterParamIndexEquals.java:29)
        at com.espertech.esper.filter.FilterHandleSetNode.matchEvent(FilterHandleSetNode.java:99)
        at com.espertech.esper.filter.EventTypeIndex.matchType(EventTypeIndex.java:170)
        at com.espertech.esper.filter.EventTypeIndex.matchEvent(EventTypeIndex.java:108)
        at com.espertech.esper.filter.FilterServiceBase.retryableMatchEvent(FilterServiceBase.java:179)
        at com.espertech.esper.filter.FilterServiceBase.evaluateInternal(FilterServiceBase.java:109)
        at com.espertech.esper.filter.FilterServiceLockCoarse.evaluate(FilterServiceLockCoarse.java:67)
        at com.espertech.esper.core.service.EPRuntimeImpl.handleFilterFault(EPRuntimeImpl.java:1267)
        at com.espertech.esper.core.service.EPRuntimeImpl.processStatementFilterSingle(EPRuntimeImpl.java:1242)
        at com.espertech.esper.core.service.EPRuntimeImpl.handleFilterFault(EPRuntimeImpl.java:1271)
        at com.espertech.esper.core.service.EPRuntimeImpl.processStatementFilterSingle(EPRuntimeImpl.java:1242)
......................................................................................................................................................................

Почему возникает это исключение и как я могу решить эту проблему? Спасибо.


person quantum    schedule 04.07.2016    source источник
comment
Вы должны предоставить полную трассировку стека.   -  person goodie    schedule 04.07.2016
comment
Все строки ниже ...................................... на com.espertech .esper.core.service.EPRuntimeImpl.handleFilterFault(EPRuntimeImpl.java:1271) в com.espertech.esper.core.service.EPRuntimeImpl.processStatementFilterSingle(EPRuntimeImpl.java:1242) в com.espertech.esper.core.service.EPRuntimeImpl .handleFilterFault(EPRuntimeImpl.java:1271) в com.espertech.esper.core.service.EPRuntimeImpl.processStatementFilterSingle(EPRuntimeImpl.java:1242) в com.espertech.esper.core.service.EPRuntimeImpl.handleFilterFault(EPRuntimeImpl.java:1271) )   -  person quantum    schedule 06.07.2016


Ответы (1)


Исправлено в версии 5.5.0

Из журнала изменений (https://github.com/espertechinc/esper/blob/master/changelog.txt):

Исправлена ​​ошибка: исправлена ​​проблема с переполнением стека ESC-000-00001 при создании оператора изолированного шаблона, частичном завершении шаблона и отмене изоляции stmt.

person quantum    schedule 04.10.2016