Я пытаюсь программно заблокировать состояние в потоке, как только оно будет выбрано из хранилища, и затем выполнить параллельный запрос, используя Jmeter, чтобы проверить это. Проблема в том, что, если я выполняю запросы для 5 потоков, блокировка применяется к одному и тому же состоянию двумя потоками, что приводит к исключению нотариуса. Другие 3 потока работают нормально и генерируют пользовательское исключение потока (которого я хочу добиться).
public void applySoftLock(UUID id, StateRef states, ServiceHub serviceHub, Logger logger) throws FlowException {
try {
logger.info("Concurrent Execution - Applying soft lock : " + states.getTxhash().toString());
logger.info("Concurrent Execution - HASH of the state is : " + states.hashCode());
synchronized (states){
serviceHub.getVaultService().softLockReserve(id, NonEmptySet.of(states));
}
logger.info("Concurrent Execution - Soft lock applied");
}
catch (Exception e) {
logger.error("Concurrent Execution - In progress.Please try after some time. "+ e.getMessage());
throw new FlowException("Concurrent Execution - Generic Exception: " + e.getMessage());
}
}
Ниже приведены журналы, которые печатаются после применения softLock.
February 28th 2020, 12:02:32.096 cordanode host-dev 06:32:32.095 [Node thread-1] INFO somepackage.someFlow - Concurrent Execution - State locked: c6a7aa91-eb04-4243-a556-71db955b1d6c with softLockUUID : 4a1e5cf8-6f36-4c29-bc29-86951ed30b7f
February 28th 2020, 12:02:30.978 cordanode host-dev 06:32:30.977 [Node thread-1] INFO somepackage.someFlow - Concurrent Execution - State locked: c6a7aa91-eb04-4243-a556-71db955b1d6c with softLockUUID : 53e6729c-caaa-45df-b230-a7fb1001ea2d
Примечание: также пытался использовать блок synchronized
, но это тоже не помогло.
Если кто-то сталкивался с той же проблемой или смог ее решить, поделитесь ссылкой или примерами того, как избежать net.corda.core.flows.NotaryException: Unable to notarise transaction
и успешно применить softLock.
Спасибо