Запуск совмещенного блока кода для каждого элемента в кэше Ignite

У меня есть блок кода, который я хочу запустить для каждого значения в кеше Ignite. Блок может быть реализован как функция, которая берет значение из кеша и возвращает пустой (единичный) результат. Я хочу, чтобы вычисление было совмещено с данными, чтобы никакие значения не передавались по сети во время запроса.

Я нашел функцию IgniteCache::query, но это не совсем то, что мне нужно . Проблема в том, что query принимает ScanQuery, который инкапсулирует IgniteBiPredicate, который является функцией, возвращающей логическое значение. Меня не интересует оценка предиката или возврат значения. Моя функция оценивается исключительно из-за ее побочного эффекта (в моем случае это запрос API к другой системе).

Проще говоря, IgniteCache::query похож на filter, но мне нужен foreach.


person Landon Kuhn    schedule 26.09.2016    source источник


Ответы (1)


Вы можете транслировать замыкание [1] и использовать метод IgniteCache.localEntries() для перебора локальных данных на каждом узле.

[1] https://apacheignite.readme.io/docs/distributed-closures#broadcast-methods

person Valentin Kulichenko    schedule 26.09.2016
comment
Спасибо. Я использую режим секционированного кеша с CacheConfiguration#backups > 0. Как сделать так, чтобы каждый элемент в кеше обрабатывался ровно один раз? Или это уже как-то гарантировано? - person Landon Kuhn; 26.09.2016
comment
IgniteCache.localEntries(CachePeekMode.PRIMARY) вернет только основные записи. - person Valentin Kulichenko; 27.09.2016