AWS Тайм-аут WebSocket шлюза API? - PullRequest
0 голосов
/ 05 мая 2020

Как сделать так, чтобы API-интерфейс API Gateway Websocket с Lambda Java не превышал тайм-аут через 30 секунд? поддерживать соединение Websocket, но я не нашел простого рабочего примера (в Java). Передняя часть использует HTML 5 веб-сокетов (vanilla javascript).

Я включаю свой тестовый драйвер Lambda в Java. Это приводит к тому, что API-интерфейс API Gateway WS истекает через 30 секунд, как описано в документации. Водитель успешно вернется, если вы уберете задержку. Любая помощь приветствуется ...

import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.fasterxml.jackson.databind.ObjectMapper;

public class TestWSClient implements RequestStreamHandler {

    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
        try {
            //
            // How do we keep API Gateway from timing out after 30 seconds?
            // Is something like this even needed in the lambda?
            //
            new Thread(() -> {
                while(true) {    
                    try {
                        // Ping client every 15 seconds
                        Thread.sleep(15000);
                        //outputStream.write(); // What to write -- 0x89 0x00?
                        outputStream.flush();
                    } catch(Exception e) { e.printStackTrace(); }
                }
            }).start();

            //
            // Simulate long processing time or streaming
            //
            // NOTE: commenting sleep enables service to return w/o a timeout
            //       connection from API Gateway
            //
            try { Thread.sleep(60000); } catch(Exception e) {}

            var response = Map.of(
                "statusCode", 200,
                "headers", Map.of("Content-Type", "text/csv"),
                "body", "Hello,World"
            );

            ObjectMapper om = new ObjectMapper();

            outputStream.write(om.writeValueAsBytes(response));
            outputStream.flush();
        } catch(Exception e) { e.printStackTrace(); }
        finally { try { outputStream.close(); } catch(Exception e) {} }
    }
}

1 Ответ

0 голосов
/ 06 мая 2020

Я не думаю, что правильно понимаю вашу проблему, но вот как работает API WebSocket из моего опыта. client (s) <- (1) -> API Gateway <- (2) -> Lambda

1) - это соединение с веб-сокетом, которое остается открытым не более 2 часов с таймаутом простоя 10 минут. как упоминалось здесь. https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html

2) связь управляется с помощью @connection https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-how-to-call-websocket-api-connections.html

Я считаю, что вы хотите использовать @connection для разговора со своим API-шлюз из лямбда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...