Я использую Spring AMQP для предоставления службы RP C, поэтому синхронные вызовы могут быть сделаны из других микросервисов - однако я сталкиваюсь с проблемой совместного использования одной транзакции во всей операции. Рассмотрим настройку ниже:
1) RP C вызов
@Transactional
Item rpcSendAndReceive(Long oldId) {
var oldItem = itemRepository.findById(oldId);
var newItem = itemService.clone(oldItem);
rpcService.populate(new Payload(newItem.getId())); // a blocking call - see 2)
return newItem;
}
2) rpcService.populate()
реализация
void populate(Payload payload) {
var item = itemRepository.findById(payload.getId()); // null
populationService.fill(item);
}
Дело в том, что во время RP C выполнение метода, транзакция еще не зафиксирована (и не должна быть, так как rpcService.populate
имеет решающее значение для бизнес-логики c и должна вызвать откат в случае неудачи), следовательно, itemRepository.findById(payload.getId())
вернет null
. Чего я хотел бы добиться, так это поделиться сделкой, начатой у производителя (1)
, чтобы товар можно было найти у потребителя (2)
. Есть ли способ сделать это возможным, или я пытаюсь сделать что-то практически невозможное с AMQP здесь?