Я изучаю прецедент, когда ignite должен прослушивать изменения свойства объекта в сетке данных и выполнять некоторые операции над этим объектом. Для производительности я хочу, чтобы обработка выполнялась на том же узле, где находятся данные.Apache запускает прослушивание изменений состояния объектов в локальных узлах
Как я могу получить событие, когда свойство объекта изменилось конкретное значение (например, Object «
X
» имеет свойство «state
», который установлен в «scheduled
» от «created
») и убедитесь, что только события берутся из узла, в котором находится объект?Как я могу убедиться, что когда я получил событие и начну его обрабатывать, никто не изменяет объект (только чтение разрешено) до завершения обработки (другими словами, транзакция начинается, как только событие подобрал)?
Как я могу убедиться, что код обработки развернут во всех узлах (обработка не установлена) код обработки будет обновлен в будущем, то объекты остаются нетронутыми)
то, что я получил от Docs является следующее:
// Local listener that listenes to local events.
IgnitePredicate<CacheEvent> locLsnr = evt -> {
// CODE
return result;
};
// Subscribe to specified cache events occuring on local node.
ignite.events().localListen(locLsnr,
EventType.EVT_CACHE_OBJECT_PUT);
в
CODE
блок; Я должен проверить изменениеstate
на 'evt.newValue()
', разве это нельзя сделать раньше? То есть. как пареметр для localListen как-то?В блоке
CODE
Объект заблокирован до тех пор, пока я не верну результат? Другими словами, он здесь, что я уверен, что никто не может изменить объект и что я могу безопасно изменить свой объект? ИМО это странное место, чтобы сделать это в определении «Предикат», а не в классе обработчика.
Sven
Для вашего последнего ответа: как сделать обновление кеша асинхронно? Объект действительно может не меняться между ... – Sven
@Sven, если вы хотите атомизировать два или более кеш-данных, вы не должны использовать события, просто откройте транзакцию и выполните все операции с кешем внутри нее. Если вы не можете запустить транзакцию на стороне клиента по какой-либо причине, отправьте закрытие на соответствующий серверный узел (https://apacheignite.readme.io/docs/collocate-compute-and-data) и выполните там транзакцию. –
Вариант использования: изменение состояния объекта, средства в сетке, действие должно выполняться путем выполнения кода (т. Е. На основе события, без участия клиентов). Пока выполняется код, ничто не должно изменять объект до тех пор, пока выполнение не остановится и объект не будет обновлен. Как я могу это сделать без использования событий? Вы имеете в виду использование async affinityRun изнутри слушателя на объекте? – Sven