Я сталкиваюсь с проблемой, когда мой запрос на сохранение основной базы данных ждет моего метода @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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Огонь и забыть, используя задачу или просто вызывая асинхронный метод без ожидания
Anonymous » » в форуме C# - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-