2016-01-05 3 views
1

Я изучаю прецедент, когда 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

ответ

2

Sven,

Ваш код выглядит правильно и должно работать, как вы ожидаете. Отвечая на ваши вопросы:

  • Слушатель событий вызывается сразу после обновления значения, поэтому я думаю, что это нормально, чтобы проверить интересующее вас поле внутри слушателя. Если поле не изменилось, сразу верните его.
  • Объект заблокирован, потому что прослушиватель вызывается внутри блока синхронизации для записи. Вы можете изменить один и тот же объект, но я бы не рекомендовал выполнять какие-либо операции синхронизации, такие как обновления кеша внутри слушателя, потому что он подвержен ошибкам и может повлиять на производительность. Вы должны сделать это асинхронно, чтобы блокировка была выпущена как можно скорее.
+0

Для вашего последнего ответа: как сделать обновление кеша асинхронно? Объект действительно может не меняться между ... – Sven

+0

@Sven, если вы хотите атомизировать два или более кеш-данных, вы не должны использовать события, просто откройте транзакцию и выполните все операции с кешем внутри нее. Если вы не можете запустить транзакцию на стороне клиента по какой-либо причине, отправьте закрытие на соответствующий серверный узел (https://apacheignite.readme.io/docs/collocate-compute-and-data) и выполните там транзакцию. –

+0

Вариант использования: изменение состояния объекта, средства в сетке, действие должно выполняться путем выполнения кода (т. Е. На основе события, без участия клиентов). Пока выполняется код, ничто не должно изменять объект до тех пор, пока выполнение не остановится и объект не будет обновлен. Как я могу это сделать без использования событий? Вы имеете в виду использование async affinityRun изнутри слушателя на объекте? – Sven

Смежные вопросы