Я пишу потребителю, который должен обрабатывать данные, написанные производителем. Как только производитель закончит запись, потребитель должен начать обработку данных, принадлежащих указанному c providerExecutionId. Я определил сущность ConsumerExecution, чтобы повторять обработку потребителя.
Проблема в том, что потребитель фактически работает в нескольких экземплярах, и мне требуется только один шаг для обработки каждого вывода выполнения производителя.
Приведенный ниже код не синхронизируется между экземплярами-получателями:
@Transactional
public ConsumerExecution initiateConsumerExecutionIfNeeded(String producerExecutionId) {
consumerExecution lastConsumerExecution = consumerExecutionRepository.findTopByOrderByIdDesc();
if (lastConsumerExecution != null && producerExecutionId.equals(lastConsumerExecution.getProducerExecutionId())) {
return null;
}
consumerExecution consumerExecution = new ConsumerExecution(producerExecutionId);
consumerExecutionRepository.save(consumerExecution);
return consumerExecution;
}
Добавление @Transactional не является достаточным, поскольку не помешает двум экземплярам успешно создать ConsumerExecution и сохранить его.
It Кажется, мне нужен какой-то способ заблокировать всю таблицу, но, похоже, @Lock не может обеспечить эту функциональность.
Может быть, мне следует как-то добавить к findTopByOrderByIdDes c что-то вроде: WITH (TABLOCK, HOLDLOCK), как в здесь ?