22Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
33SPDX-License-Identifier: Apache-2.0
44*/
5+
56package com .amazonaws .services .lambda .runtime .api .client ;
67
78import com .amazonaws .services .lambda .crac .Core ;
3536import java .security .Security ;
3637import 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 ) {
0 commit comments