IgniteCache # invoke (...) - это транзакционная операция.Лучший способ узнать это - проверить, генерирует ли оно TransactionException.
Ваша конфигурация кажется достаточной для обеспечения согласованности данных между узлами.
Если вы имеете в виду согласованность между этими двумя кэшами, то выможет запускать явные транзакции и запускать invoke -s внутри них.
UPD
Обратите внимание, что, как упоминалось в JavaDoc для invoke(..) метод, ваш EntryProcessor должен быть без сохранения состояния.Он может вызываться несколько раз на разных узлах, поэтому он должен возвращать одно и то же значение каждый раз.
UPD 2
Если вы вызываете метод IgniteCache#invoke()
для транзакциикеш, он заставляет EntryProcessor
вызываться на каждом узле, который содержит необходимый раздел этого кеша.Но если кэш атомарный, то EntryProcessor
будет вызываться только на основном узле.
Но вы не должны полагаться на это поведение.Он нигде не указан, поэтому может измениться в будущих версиях.Ignite может совершать столько звонков на EntryProcessor#process()
, сколько необходимо для обеспечения согласованности данных.
Вы можете использовать следующий код для проверки моих слов:
public static void main(String[] args) throws IgniteException {
Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
IgniteCache<Integer, String> atomicCache = ignite.getOrCreateCache(
cacheConfiguration("atomic", CacheAtomicityMode.ATOMIC));
IgniteCache<Integer, String> txCache = ignite.getOrCreateCache(
cacheConfiguration("transactional", CacheAtomicityMode.TRANSACTIONAL));
atomicCache.invoke(1, (entry, arguments) -> {
System.out.println("Atomic invoke");
return null;
});
txCache.invoke(1, (entry, arguments) -> {
System.out.println("Transactional invoke");
return null;
});
}
private static <K, V> CacheConfiguration<K, V> cacheConfiguration(String name, CacheAtomicityMode atomicity) {
CacheConfiguration<K, V> cacheCfg = new CacheConfiguration<>(name);
cacheCfg.setAtomicityMode(atomicity);
cacheCfg.setCacheMode(CacheMode.REPLICATED);
cacheCfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
return cacheCfg;
}
"Транзакционный вызов"будет напечатан на каждом узле, но «Атомный вызов» - только на одном.