Почему фоновые потоки @Async молча терпят неудачу в Spring Boot на AWS Lambda, в то время как Node.js работает нормальноJAVA

Программисты JAVA общаются здесь
Anonymous
Почему фоновые потоки @Async молча терпят неудачу в Spring Boot на AWS Lambda, в то время как Node.js работает нормально

Сообщение Anonymous »

У нас есть приложение Spring Boot, развернутое на AWS Lambda, которое выполняет исходящие вызовы к API-интерфейсам партнеров OCPI (партнеры по роумингу EMSP). Мы используем @Async для этих исходящих вызовов, чтобы избежать блокировки основного потока обработчика. Проблема в том, что эти асинхронные вызовы никогда не завершаются в Lambda, тогда как эквивалентный Node.js Lambda (также выполняющий HTTP-вызовы по принципу «запустил и забыл») работает нормально. Код Java, который дает сбой автоматически:

Код: Выделить всё

@Async
public void notifyPartner(String partnerId, Session session) {
// This never executes on Lambda
restTemplate.postForEntity(partnerUrl, session, Void.class);
}
Работающий эквивалент Node.js:

Код: Выделить всё

exports.handler = async (event) => {
fetch('https://partner.api/session', { method: 'POST', body: JSON.stringify(event) });
return { statusCode: 200 }; // fire-and-forget, but works
};
Вопросы:

1. Почему Lambda блокирует фоновые потоки Java, но не асинхронные вызовы Node.js?

2. Это проблема с загрузкой Java/Spring или проблема с моделью выполнения Lambda?

3. Каков правильный шаблон для создания надежных исходящих HTTP-вызовов из Java Spring Boot Lambda без блокировки ответа обработчика?
Что я пробовал: - Использование CompletableFuture.runAsync() — та же проблема — Использование Spring WebClient (реактивный) — та же проблема, если не вызывается .block() — Тот же код отлично работает в EC2 с долгоработающим контейнером

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