В настоящее время у меня установлена топология, в которой используется Эспер Болт, созданный tomdz на GitHub. Кажется, что все работает нормально, за исключением случаев, когда речь идет о привязке кортежа.
В самом цилиндре Esper есть обратный вызов:
public void update(EventBean[] newEvents, EventBean[] oldEvents, EPStatement statement, EPServiceProvider epServiceProvider)
Проблема здесь в том, что у меня нет ссылки на предыдущий кортеж в дереве кортежей. Это означает, что когда я иду, чтобы испустить свой результат Эспера в следующий Болт в последовательности, я не могу предоставить кортеж для привязки:
collector.emit(new Values(eventName, eventGrouping, eventDescription, correlatedValues));
Интересно, кто-нибудь столкнулся с этой проблемой в своем собственном проекте? Если да, то как вы обошли это? Я хочу использовать привязку для обеспечения надежности сообщений во всей топологии.
Один из вариантов - привязать кортеж Storm к входному событию Esper в качестве свойства и убедиться, что Esper EPL выбирает свойство либо "select *", либо "select originaltuple". Затем слушатель может использовать это.
Другой вариант - отслеживать это за пределами Esper, используя какой-либо идентификатор события, который у вас может быть. Или используйте идентификатор входного события через идентификатор hashmap, отображающий входное событие в кортеж. Затем слушателю необходимо выполнить некоторый поиск на основе входного события Esper, который является той же ссылкой, что и Esper, также доставляет слушателю и удаляет.