in aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java [95:155]
private void eventLoop(ServletWebServerApplicationContext context) {
ServerlessMVC mvc = ServerlessMVC.INSTANCE(context);
Environment environment = context.getEnvironment();
logger.info("Starting AWSWebRuntimeEventLoop");
String runtimeApi = environment.getProperty("AWS_LAMBDA_RUNTIME_API");
String eventUri = MessageFormat.format(LAMBDA_RUNTIME_URL_TEMPLATE, runtimeApi, LAMBDA_VERSION_DATE);
if (logger.isDebugEnabled()) {
logger.debug("Event URI: " + eventUri);
}
RequestEntity<Void> requestEntity = RequestEntity.get(URI.create(eventUri))
.header("User-Agent", USER_AGENT_VALUE).build();
RestTemplate rest = new RestTemplate();
ObjectMapper mapper = new ObjectMapper();//.getBean(ObjectMapper.class);
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
AwsProxyHttpServletResponseWriter responseWriter = new AwsProxyHttpServletResponseWriter();
logger.info("Entering event loop");
while (this.isRunning()) {
logger.debug("Attempting to get new event");
ResponseEntity<String> incomingEvent = rest.exchange(requestEntity, String.class);
if (incomingEvent != null && incomingEvent.hasBody()) {
if (logger.isDebugEnabled()) {
logger.debug("New Event received from AWS Gateway: " + incomingEvent.getBody());
}
String requestId = incomingEvent.getHeaders().getFirst("Lambda-Runtime-Aws-Request-Id");
try {
logger.debug("Submitting request to the user's web application");
AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest(
AwsSpringHttpProcessingUtils.generateHttpServletRequest(incomingEvent.getBody(),
null, mvc.getServletContext(), mapper), mvc, responseWriter);
if (logger.isDebugEnabled()) {
logger.debug("Received response - body: " + awsResponse.getBody() +
"; status: " + awsResponse.getStatusCode() + "; headers: " + awsResponse.getHeaders());
}
String invocationUrl = MessageFormat.format(LAMBDA_INVOCATION_URL_TEMPLATE, runtimeApi,
LAMBDA_VERSION_DATE, requestId);
ResponseEntity<byte[]> result = rest.exchange(RequestEntity.post(URI.create(invocationUrl))
.header("User-Agent", USER_AGENT_VALUE).body(awsResponse), byte[].class);
if (logger.isDebugEnabled()) {
logger.debug("Response sent: body: " + result.getBody() +
"; status: " + result.getStatusCode() + "; headers: " + result.getHeaders());
}
if (logger.isInfoEnabled()) {
logger.info("Result POST status: " + result);
}
}
catch (Exception e) {
logger.error(e);
this.propagateAwsError(requestId, e, mapper, runtimeApi, rest);
}
}
}
}