Снижение памяти при использовании режима потока drools

Я использую Drools 6.2.Final Fusion CEP и установил событие @expires (1d), но через несколько дней обнаружил, что память снижается. Каждый день суммарно данных о событии не много. Сомневаюсь, что событие в рабочей памяти после истечения срока действия не ясно. Поэтому хочу кое-что подтвердить:

1. Режим потока Fusion CEP. Сеанс с сохранением состояния должен dispose() после fireAllRules()? В моем коде ksession будет создавать только один раз в методе инициализации, а затем использовать его для вставки события и запуска всех правил, но я никогда не использую метод dispose() после пожара. Меня беспокоит не то, что я не использовал метод, из-за которого событие осталось в памяти.

2.Событие после истечения срока автоматически удаляется из памяти? Боюсь, что событие не очищается должным образом, в результате чего память снижается.

@org.kie.api.definition.type.Role(org.kie.api.definition.type.Role.Type.EVENT)
@org.kie.api.definition.type.TypeSafe(true)
@org.kie.api.definition.type.Timestamp("beginTime")
@org.kie.api.definition.type.Expires("1d")
public class Event{
    private Long beginTime;

    // ...other fields, set and get method..
}

--

poublic void initKsession()throws Exception{
    KieServices kieServices = KieServices.Factory.get();
    KieBaseConfiguration config = KieServices.Factory.get().newKieBaseConfiguration();
    config.setOption(EventProcessingOption.STREAM);
    ReleaseId releaseId = kieServices.newReleaseId(groupId, artifactId, version);
    KieContainer kContainer = kieServices.newKieContainer(releaseId);
    KieScanner kScanner = kieServices.newKieScanner(kContainer);    
    kSession = kContainer.newKieSession(kessionName);
    kScanner.start(10000L);
}

--

public Result processRules(Event event) {
    // ....
    try {
        kSession.insert(event);
        kSession.fireAllRules();
    } catch (Exception e) {
        log.error("fail",e);
    }
    // ....
}

person DD.Choi    schedule 15.05.2015    source источник
comment
Невозможно судить о том, что вы делаете, по вашим отрывочным замечаниям. Что вы имеете в виду под словом "после пожара"? Или с помощью функции накопления? Или память подвела? - Вы уверены, что именно события вызывают OoM? Вы подключили прослушиватель, отслеживающий вставки и удаления, поддерживающий баланс?   -  person laune    schedule 15.05.2015
comment
Извините, я исправил описание. Я хочу спросить, почему событие в рабочей памяти не удаляется автоматически, и как сохранить баланс памяти. Спасибо за вашу помощь @laune   -  person DD.Choi    schedule 16.05.2015
comment
Не вызывайте dispose в StatefulKieSession, если только вы не завершили использование этого сеанса — это самая последняя очистка. - Используйте прослушиватель, чтобы узнать, как вводятся и удаляются факты вашего события и как увеличивается их количество. Затем, зная это, пришло время обсудить, как отбрасывать устаревшие/устаревшие события.   -  person laune    schedule 16.05.2015
comment
Да, есть ли какой-нибудь метод drools / API, который может удалить устаревший пакет событий? @laune   -  person DD.Choi    schedule 17.05.2015
comment
Есть ретракт, и вам придется реализовать устаревший тест.   -  person laune    schedule 17.05.2015


Ответы (1)


После теста я обнаружил, почему событие не было удалено правильно. Мне нужно объявить @expires в правиле следующим образом:

declare Event
    @role(event)
    @timestamp(beginTime)
    @expires(2m)
end

И комментарий не вступает в силу, когда я добавляю над классом Event.

@org.kie.api.definition.type.Timestamp("beginTime")
@org.kie.api.definition.type.Expires("1d")
public class Event{....}
person DD.Choi    schedule 18.05.2015