Как определить функцию для AWS Lambda для запуска в Java?

64
6

Я использую этот документ как учебник http://docs.aws.amazon.com/lambda/latest/dg/get-started-step4-optional.html

Метод ввода/функция, который они подают для AWS lamda, выглядит следующим образом:

public String myHandler(int myCount, Context context) {
LambdaLogger logger = context.getLogger();
logger.log("received : " + myCount);
return String.valueOf(myCount);
}

Моя проблема в том, что я не знаю, какие аргументы я могу определить и как AWMS лямбда знает, что мне передать. Было бы здорово увидеть все возможные сигнатуры методов, которые я мог бы придумать. Может быть, я просто не смотрю в нужное место для этой документации, но мне бы хотелось, чтобы я мог сделать что-то вроде

public String myHandler(String json) {
MyJsonValidatorClass validator = new ...;
boolean isValid = validator.isValidJson(json);
return String.valueOf(isValid);
}

Я просто не знаю, что я могу сделать в AWS Lamdas. При написании основного приложения java, я знаю, что у меня есть String [] args, и я ничего не имею против. Я что-то упустил? Или я просто думаю об этом совершенно неправильно?

спросил(а) 2021-01-19T12:26:58+03:00 6 месяцев, 2 недели назад
1
Решение
91

Время выполнения lambda использует отражение, чтобы увидеть, какой тип хочет ваш метод в качестве первого параметра, затем пытается проанализировать исходные входные данные в соответствии с этой спецификацией. Типы, которые он поддерживает, перечислены здесь:

    Простые типы Java (AWS Lambda поддерживает типы String, Integer, Boolean, Map и List) POJO (простой старый объект Java) Тип потока (Если вы не хотите использовать POJO или если метод последовательной привязки Lambda не соответствует вашим потребностям, вы можете использовать реализацию потока байтов. [..])

Примерами того, как выглядят методы обработчика, являются:

// you could do your own json parsing in here
String handler(String input, Context context)

// lambda parses json for you
JoinResponsePojo handler(JoinRequestPojo request, Context context)

// when even String is not enough
void handler(InputStream inputStream, OutputStream outputStream, Context context)

Для удобства и для предотвращения ошибок существуют интерфейсы RequestHandler и RequestStreamHandler которые захватывают точно выше сигнатуры методов (docs). Обычно я использую эти методы, а не методы управления методом фристайла.

Обычно наиболее удобным способом является работа с POJO напрямую, так как обычно входной сигнал json. Существуют также предопределенные POJO для общих событий в aws-lambda-java-events вы можете использовать. Или вы можете написать свой собственный, как описано в "Пример: использование POJO для ввода/вывода обработчика (Java)"

js callbacks используются для возврата данных, поэтому ваш пример либо

public class ExampleHandler1 implements RequestHandler<String, String> {
@Override
public String handleRequest(String input, Context context) {
// would preferably use some other way to generate json
return "{\"speech\": \"hello theres\"}";
}
}

или используя pojo как

public class ExampleHandler2 implements RequestHandler<String, Speech> {

public static class Speech {
private String speech;
public String getSpeech() {
return speech;
}
public void setSpeech(String speech) {
this.speech = speech;
}
}

@Override
public Speech handleRequest(String input, Context context) {
Speech speech = new Speech();
speech.setSpeech("hello theres");
return speech;
}
}

ответил(а) 2021-01-19T12:26:58+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема