Обновлять значение в регионе ТОЛЬКО ЕСЛИ value.status 'XXX' - PullRequest
0 голосов
/ 06 сентября 2018

Мы пытаемся использовать Gemfire в нашей работе. У нас есть регион, в котором мы храним каждый поступающий запрос, и он проходит свой жизненный цикл (например, состояния A -> B -> C -> D)

Но у нас также есть требование, что нам нужно обновлять состояние до C, только если текущее состояние - B (так как состояние D получает обновленный Async другим процессом). Мы привыкли достигать этого в Кассандре, используя только ключевое слово IF. Ищете что-то похожее в Gemfire. Очевидно, что мы не можем выполнять чтение, проверку состояния и обновление, потому что они не атомарны.

Другой вариант состоял в том, чтобы сделать это, взяв распределенную блокировку, а затем выполнить проверку обновлений, как упомянуто выше. Но этот вариант идет с накладными расходами.

Мы также думали о подключении CacheWriter и проверке состояния в beforeUpdate (..). Но мы узнали, что то, что мы получаем в качестве параметра beforeUpdate, является копией значения, а не действительным значением.

У кого-нибудь есть идеи, как этого добиться атомным способом, который мы можем попробовать?

1 Ответ

0 голосов
/ 06 сентября 2018

Что вы ищете, так это Region.replace (ключ, oldValue, newValue) . Это атомарная операция.

ОБНОВЛЕНИЕ: Я также должен уточнить, что в настоящее время невозможно проверить определенные свойства значения сопоставленного объекта (например, someObject.state = XYZ), чтобы выяснить, выполнять ли обновление / замену. Для этого вам потребуется правильно реализованный метод Object.equals().

...