Есть ли способ обрабатывать более одного объекта событий в Java для AWS Lambda? Например, при обработке события SNSE я могу сделать следующее:
public class Hello implements RequestHandler<SNSEvent, Response> {
public Response handleRequest(SNSEvent event, Context context) {
//handle SNSEvent here
}
}
Есть ли способ обработать как SNSEvent, так и SQSEvent в одной лямбде?





Есть несколько способов обработки события Lambda в Java. Вы показываете модель POJO с определенными AWS POJO, где десериализация объекта выполняется за вас.
Однако есть еще метод IO Stream. Это дает вам InputStream и OutputStream, которыми вы можете управлять самостоятельно. Код, полученный из второй ссылки выше, может начинаться примерно так:
public class Hello implements RequestStreamHandler{
public void handler(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
// copy and convert the inputStream
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
String inputString = result.toString("UTF-8");
// now try to convert to a SNSEvent using Google GSON
try {
SNSEvent snsEvent = new Gson().fromJson(inputString, SNSEvent.class);
}
catch( JsonSyntaxException jse ) {
// this is where it's weird - what if it is really bad JSON?
}
}
}
В конечном итоге это делается для того, чтобы взять ввод JSON, скопировать его на String, а затем использовать GSON для преобразования, чтобы попытаться преобразовать в объект. У вас может быть любое количество объектов, в которые код пытается преобразовать. Метод GSON fromJson выдает JsonSyntaxException, если он не может быть преобразован. Но он также сделал бы это, если бы был полностью мусорный JSON, поэтому вам нужно быть немного осторожнее.
Я показываю это с помощью GSON, так как у меня было слишком много странных взаимодействий с Джексоном, которые Lambda использовала под прикрытием для синтаксического анализа JSON.
Но это позволяет вам управлять InputStream самостоятельно, решая, что делать со входом, и отправлять свой собственный Response в OutputStream.
Вы можете провести некоторый самоанализ, который вы можете провести на String (т.е. содержит ли он конкретную подстроку), который вы создаете, но в противном случае я бы сделал серию блоков catch / try для этого.
Есть ли способ отличить SNSEvent от SQSEvent? Или мне придется попробовать преобразовать в один. Если не получится, попробовать преобразовать в другой?