Почему мой асинхронный метод ожидания заканчивался, чтобы дать ответJAVA

Программисты JAVA общаются здесь
Anonymous
Почему мой асинхронный метод ожидания заканчивался, чтобы дать ответ

Сообщение Anonymous »

Я сталкиваюсь с проблемой, когда мой запрос на сохранение основной базы данных ждет моего метода @async вместо возврата ответа. После сохранения в аспекте базы данных опубликовать событие My @Async @eventlistner Метод запускается, но основной поток подождите, пока мой асинхрон завершает работу. Мне нужно основное, прежде чем метод @Async завершить работу < /p>
@EnableAsync
@Configuration
public class AsyncConfiguration {

@Bean
public Executor asyncTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(4);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("AsyncTaskThread-");
executor.initialize();

return executor;
}
}
< /code>
Метод, где мы сохраняем в дБ < /p>
@Override
@Transactional
public OffsettingEntity createDraftOffset(OffsettingEntity draftOffset) {
return offsettingRepository.save(draftOffset);
}
< /code>
@Slf4j
@Component
@RequiredArgsConstructor
public class OffsettingEventListener {
private final OffsettingOutboxService offsettingOutboxService;

@Async("asyncTaskExecutor")
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void postSave(OffsettingRegisteredEvent event) {
UUID uniqueKey = UUID.randomUUID();
MDC.put("offsetId", String.valueOf(event.offsetId()));
MDC.put("uniqueKey", String.valueOf(uniqueKey));
MDC.put("eventType", "OffsettingRegisteredEvent");

try {

RequestContext.setUniqueKey(uniqueKey);

offsettingOutboxService.createMessageToRo(event);
} catch (Exception ex) {
log.error("error: {}", event.offsetId(), ex);
} finally {
RequestContext.clear();
}
}
}
< /code>
@Aspect
@Component
@RequiredArgsConstructor
public class AspectOffsettingRepository {

private final ApplicationEventPublisher publisher;
private static final String STATUS_FOR_MESSAGE = "REGISTERED";

@AfterReturning(
pointcut = "execution(* service.repository.impl.OffsettingJpaRepository.save(..))",
returning = "result"
)
public void afterSave(OffsettingEntity result) {
handleAfterSave(result);
}

@AfterReturning(
pointcut = "execution(* service.repository.impl.OffsettingJpaRepository.saveAndFlush(..))",
returning = "result"
)
public void afterSaveAndFlush(OffsettingEntity result) {
handleAfterSave(result);
}

private void handleAfterSave(OffsettingEntity entity) {
if (entity.getStatus() != null && STATUS_FOR_MESSAGE.equals(entity.getStatus())) {
publisher.publishEvent(new OffsettingRegisteredEvent(
entity.getOffsetId(),
entity.getCreatedBy(),
entity.getFirstPartnerId().toString()
));
}
}
}
< /code>
P.S. My async method works in AsyncTaskThread-1 not main thread

Подробнее здесь: https://stackoverflow.com/questions/797 ... a-response

Вернуться в «JAVA»