0

При сохранении объекта домена в службе с flush: true при сохранении домена объект не будет сохранен, прежде чем я буду использовать этот объект.Возможно ли принудительное удаление домена в службе?

Domain domain = new Domain(property: something.toString()).save(failOnError: true, flush: true) 

Я не уверен, как заставить флеш в спящей сессии в одном из сервисов, которые я использую.

В каком-то контексте я делаю вызов API для службы API, который отправляется на другую службу, где я сохраняю домен, а затем обратно в службу API, а затем добавляю строку в очередь RabbitMQ, а затем возвращаю 200OK для пользователя. Но поскольку домен не сохраняется во второй службе, когда элемент добавляется в очередь, rabbitMQ обрабатывает сообщение до того, как домен будет сохранен.

EDIT:

Мой текущий фикс:

контроллер API:

def apiActionCreate() 
{ 
    Map returnMap = apiService.createAction(params, request) 
    rabbitSend staticQueue, [id: returnMap.id.toString()] 
} 

сервис API:

Map createAction(GrailsParameterMap params, HttpServletRequest request) 
{ 
    //do some logic related to a related domain 
    seperateService.someAction(domain.id) 
} 

Service, где я экономлю домен:

Map someAction(UUID id) 
{ 
    Domain domain = new Domain(property: something.toString()).save(failOnError: true, flush: true) 
} 
+1

Возможно, это из-за [еще не совершенных] транзакций? –

+0

Выше именно поэтому экземпляр еще не существует. Подтверждение 'flush: true' на экземпляре домена - это просто. Подсказка к Hibernate для очистки любого ожидающего SQL до базы данных. Однако, в зависимости от уровня изоляции транзакции эти изменения могут быть недоступны для других потоков или сеансов Hibernate. Вы могли бы изучить установку менее ограничительного уровня изоляции, но у этого есть недостаток фантомных или грязных чтений (в зависимости от того, какой уровень изоляции вы выбираете). –

+0

Хмм .. @JoshuaMoore, имея в виду, было бы проще просто перейти от контроллера к службе API, чем бы мне ни понадобилось и обратно к контроллеру? Мой опыт аналогичных проблем заключается в том, что когда вы возвращаетесь к контроллеру из службы, информация, сохраненная в этой службе, сохраняется в базе данных. –

ответ

0

Вы можете создать транзакцию, которая будет сохраняться в DDBB при завершении.

MyDomain.withTransaction{ 
     somecode() 
} 
+0

Это не сработало для меня печально. Я не мог заставить это работать правильно.В итоге я просто вернулся на уровень контроллера и позволил сохранить домен перед отправкой запроса на RabbitMQ. –