Skip to content

Commit e1f5873

Browse files
M-ElsaeedMohammed Ehab
and
Mohammed Ehab
authored
Refactor the Main Function Into Three Main Blocks. (#526)
* Refactor the Main Function Into Three Main Blocks. * Use Try with Resources for logger. * Fix Linting Errors --------- Co-authored-by: Mohammed Ehab <[email protected]>
1 parent 574ac85 commit e1f5873

File tree

2 files changed

+62
-45
lines changed

2 files changed

+62
-45
lines changed

aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/AWSLambda.java

+53-44
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
33
SPDX-License-Identifier: Apache-2.0
44
*/
5+
56
package com.amazonaws.services.lambda.runtime.api.client;
67

78
import com.amazonaws.services.lambda.crac.Core;
@@ -35,7 +36,6 @@
3536
import java.security.Security;
3637
import java.util.Properties;
3738

38-
3939
/**
4040
* The entrypoint of this class is {@link AWSLambda#startRuntime}. It performs two main tasks:
4141
*
@@ -137,6 +137,42 @@ private static LambdaRequestHandler findRequestHandler(final String handlerStrin
137137
return requestHandler;
138138
}
139139

140+
private static LambdaRequestHandler getLambdaRequestHandlerObject(String handler, LambdaContextLogger lambdaLogger) throws ClassNotFoundException, IOException {
141+
UnsafeUtil.disableIllegalAccessWarning();
142+
143+
System.setOut(new PrintStream(new LambdaOutputStream(System.out), false, "UTF-8"));
144+
System.setErr(new PrintStream(new LambdaOutputStream(System.err), false, "UTF-8"));
145+
setupRuntimeLogger(lambdaLogger);
146+
147+
runtimeClient = new LambdaRuntimeApiClientImpl(LambdaEnvironment.RUNTIME_API);
148+
149+
String taskRoot = System.getProperty("user.dir");
150+
String libRoot = "/opt/java";
151+
// Make system classloader the customer classloader's parent to ensure any aws-lambda-java-core classes
152+
// are loaded from the system classloader.
153+
customerClassLoader = new CustomerClassLoader(taskRoot, libRoot, ClassLoader.getSystemClassLoader());
154+
Thread.currentThread().setContextClassLoader(customerClassLoader);
155+
156+
// Load the user's handler
157+
LambdaRequestHandler requestHandler = null;
158+
try {
159+
requestHandler = findRequestHandler(handler, customerClassLoader);
160+
} catch (UserFault userFault) {
161+
lambdaLogger.log(userFault.reportableError(), lambdaLogger.getLogFormat() == LogFormat.JSON ? LogLevel.ERROR : LogLevel.UNDEFINED);
162+
LambdaError error = new LambdaError(
163+
LambdaErrorConverter.fromUserFault(userFault),
164+
RapidErrorType.BadFunctionCode);
165+
runtimeClient.reportInitError(error);
166+
System.exit(1);
167+
}
168+
169+
if (INIT_TYPE_SNAP_START.equals(AWS_LAMBDA_INITIALIZATION_TYPE)) {
170+
onInitComplete(lambdaLogger);
171+
}
172+
173+
return requestHandler;
174+
}
175+
140176
public static void setupRuntimeLogger(LambdaLogger lambdaLogger)
141177
throws ClassNotFoundException {
142178
ReflectUtil.setStaticField(
@@ -176,55 +212,27 @@ private static LogSink createLogSink() {
176212
}
177213
}
178214

179-
public static void main(String[] args) {
180-
startRuntime(args[0]);
181-
}
215+
public static void main(String[] args) throws Throwable {
216+
try (LambdaContextLogger logger = initLogger()) {
217+
LambdaRequestHandler lambdaRequestHandler = getLambdaRequestHandlerObject(args[0], logger);
218+
startRuntimeLoop(lambdaRequestHandler, logger);
182219

183-
private static void startRuntime(String handler) {
184-
try (LogSink logSink = createLogSink()) {
185-
LambdaContextLogger logger = new LambdaContextLogger(
186-
logSink,
187-
LogLevel.fromString(LambdaEnvironment.LAMBDA_LOG_LEVEL),
188-
LogFormat.fromString(LambdaEnvironment.LAMBDA_LOG_FORMAT)
189-
);
190-
startRuntime(handler, logger);
191-
} catch (Throwable t) {
220+
} catch (IOException | ClassNotFoundException t) {
192221
throw new Error(t);
193222
}
194223
}
195224

196-
private static void startRuntime(String handler, LambdaContextLogger lambdaLogger) throws Throwable {
197-
UnsafeUtil.disableIllegalAccessWarning();
198-
199-
System.setOut(new PrintStream(new LambdaOutputStream(System.out), false, "UTF-8"));
200-
System.setErr(new PrintStream(new LambdaOutputStream(System.err), false, "UTF-8"));
201-
setupRuntimeLogger(lambdaLogger);
225+
private static LambdaContextLogger initLogger() {
226+
LogSink logSink = createLogSink();
227+
LambdaContextLogger logger = new LambdaContextLogger(
228+
logSink,
229+
LogLevel.fromString(LambdaEnvironment.LAMBDA_LOG_LEVEL),
230+
LogFormat.fromString(LambdaEnvironment.LAMBDA_LOG_FORMAT));
202231

203-
runtimeClient = new LambdaRuntimeApiClientImpl(LambdaEnvironment.RUNTIME_API);
204-
205-
String taskRoot = System.getProperty("user.dir");
206-
String libRoot = "/opt/java";
207-
// Make system classloader the customer classloader's parent to ensure any aws-lambda-java-core classes
208-
// are loaded from the system classloader.
209-
customerClassLoader = new CustomerClassLoader(taskRoot, libRoot, ClassLoader.getSystemClassLoader());
210-
Thread.currentThread().setContextClassLoader(customerClassLoader);
232+
return logger;
233+
}
211234

212-
// Load the user's handler
213-
LambdaRequestHandler requestHandler;
214-
try {
215-
requestHandler = findRequestHandler(handler, customerClassLoader);
216-
} catch (UserFault userFault) {
217-
lambdaLogger.log(userFault.reportableError(), lambdaLogger.getLogFormat() == LogFormat.JSON ? LogLevel.ERROR : LogLevel.UNDEFINED);
218-
LambdaError error = new LambdaError(
219-
LambdaErrorConverter.fromUserFault(userFault),
220-
RapidErrorType.BadFunctionCode);
221-
runtimeClient.reportInitError(error);
222-
System.exit(1);
223-
return;
224-
}
225-
if (INIT_TYPE_SNAP_START.equals(AWS_LAMBDA_INITIALIZATION_TYPE)) {
226-
onInitComplete(lambdaLogger);
227-
}
235+
private static void startRuntimeLoop(LambdaRequestHandler requestHandler, LambdaContextLogger lambdaLogger) throws Throwable {
228236
boolean shouldExit = false;
229237
while (!shouldExit) {
230238
UserFault userFault = null;
@@ -240,7 +248,7 @@ private static void startRuntime(String handler, LambdaContextLogger lambdaLogge
240248
payload = requestHandler.call(request);
241249
runtimeClient.reportInvocationSuccess(request.getId(), payload.toByteArray());
242250
// clear interrupted flag in case if it was set by user's code
243-
boolean ignored = Thread.interrupted();
251+
Thread.interrupted();
244252
} catch (UserFault f) {
245253
shouldExit = f.fatal;
246254
userFault = f;
@@ -278,6 +286,7 @@ static void onInitComplete(final LambdaContextLogger lambdaLogger) throws IOExce
278286
RapidErrorType.BeforeCheckpointError));
279287
System.exit(64);
280288
}
289+
281290
try {
282291
Core.getGlobalContext().afterRestore(null);
283292
} catch (Exception restoreExc) {

aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/logging/LambdaContextLogger.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77

88
import com.amazonaws.services.lambda.runtime.logging.LogFormat;
99
import com.amazonaws.services.lambda.runtime.logging.LogLevel;
10+
import java.io.Closeable;
11+
import java.io.IOException;
1012
import static java.nio.charset.StandardCharsets.UTF_8;
1113

12-
public class LambdaContextLogger extends AbstractLambdaLogger {
14+
public class LambdaContextLogger extends AbstractLambdaLogger implements Closeable {
1315
// If a null string is passed in, replace it with "null",
1416
// replicating the behavior of System.out.println(null);
1517
private static final byte[] NULL_BYTES_VALUE = "null".getBytes(UTF_8);
@@ -29,4 +31,10 @@ protected void logMessage(byte[] message, LogLevel logLevel) {
2931
sink.log(logLevel, this.logFormat, message);
3032
}
3133
}
34+
35+
@Override
36+
public void close() throws IOException {
37+
sink.close();
38+
39+
}
3240
}

0 commit comments

Comments
 (0)