У меня есть архитектура микросервисов, где услуги общаются через Rabbitmq. В одном микросервисе (давайте назовем It Eventservice), я публикую сообщение и жду синхронного ответа от другого микросервиса (ProcesserService). Этот синхронный дизайн означает, что Eventervice ожидает, пока ProcesserService не опубликует ответ обратно. Мой слушатель транзакций (@Transactional), потому что мне нужны склонные к лениво-загруженные сущности и используйте hibernate.initialize (...). < /P>
Теперь проблема: < /p>
Если исключение возникает в повреждении, ретиптор. раз. Однажды, либо после окончательного повторения, либо прямо перед тем, как сообщение будет замерено. Однако, поскольку метод является транзакционным, я получаю неожиданную роллурбакксакцию в качестве основной причины, и это приводит к второму сообщению об ошибке, которое идет в DLQ, хотя я уже обрабатывал исключение. /> Custom FailemesseCagereCoverer для dlq. < /p>
restryInterceptorbuilder.StateLess () < /p>
Что я хочу достичь: < /strong>
. Ответ об ошибке. < /p>
Если повторная попытка пропущена (нерешительное исключение), отправьте только один ответ ошибки и избегайте дублирования DLQ из-за неожиданного роллералбакккцепса. < /p>
В идеале, сохраните @transactional, чтобы позволить ленивую загрузку (если нет чистого обновления). Загрузитесь с Spring Amqp.
Hibernate используется для Orm.
Rabbitmq используется для обмена сообщениями. повторно? @Transactional
@RabbitListener(
queues = "${spring.rabbitmq.queues[11].name}",
containerFactory = "rabbitListenerContainerFactory")
public void processUniversityMessages(MessageWrapper request) {
handleRequest(Module.UNIVERSITY, request);
}
public void handleRequest(Module module, MessageWrapper request) {
String routingKey = routingResolver.getRoutingKey(module);
String exchange = routingResolver.getExchange();
SubModule subModule = SubModule.fromString(request.getSubModule().toString());
MessageWrapper responseWrapper = new MessageWrapper();
responseWrapper.setCorrelationId(request.getCorrelationId());
responseWrapper.setModule(module);
responseWrapper.setSubModule(subModule);
try {
Object payload = request.getPayload();
switch (module) {
case COACH:
responseWrapper.setPayload(handleCoachRelatedRequest(subModule, payload));
break;
case STUDENT_ATHLETE:
responseWrapper.setPayload(handleStudentAthleteRelatedRequest(subModule, payload));
break;
case UNIVERSITY:
responseWrapper.setPayload(handleUniversityRelatedRequest(subModule, payload));
break;
case USER:
responseWrapper.setPayload(handleUserRelatedRequest(subModule, payload));
break;
case COLLEGE_ADMIN:
responseWrapper.setPayload(handleCollegeAdminRelatedRequest(subModule, payload));
break;
case PSA:
responseWrapper.setPayload(handlePSARelatedRequest(subModule, payload));
break;
default:
throw new IllegalArgumentException("Unknown module");
}
responseWrapper.setStatus(ResponseStatus.SUCCESS);
} catch (Exception e) {
ErrorResponseDto error = getErrorResponseDto(e);
responseWrapper.setPayload(error);
responseWrapper.setStatus(ResponseStatus.ERROR);
}
rabbitTemplate.convertAndSend(exchange, routingKey, responseWrapper);
}
@Bean
public RetryOperationsInterceptor retryInterceptor(
AmqpTemplate amqpTemplate, MessageConverter converter) {
// Define which exceptions should NOT trigger retries
Map
Подробнее здесь: https://stackoverflow.com/questions/796 ... istener-wi