2
2
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
SPDX-License-Identifier: Apache-2.0
4
4
*/
5
+
5
6
package com .amazonaws .services .lambda .runtime .api .client ;
6
7
7
8
import com .amazonaws .services .lambda .crac .Core ;
30
31
import java .io .IOError ;
31
32
import java .io .IOException ;
32
33
import java .io .PrintStream ;
34
+ import java .io .UnsupportedEncodingException ;
33
35
import java .lang .reflect .Constructor ;
34
36
import java .net .URLClassLoader ;
35
37
import java .security .Security ;
36
38
import java .util .Properties ;
37
39
38
-
39
40
/**
40
41
* The entrypoint of this class is {@link AWSLambda#startRuntime}. It performs two main tasks:
41
42
*
@@ -176,24 +177,28 @@ private static LogSink createLogSink() {
176
177
}
177
178
}
178
179
179
- public static void main (String [] args ) {
180
- startRuntime (args [0 ]);
181
- }
180
+ public static void main (String [] args ) throws Throwable {
181
+ try {
182
+ LambdaContextLogger logger = initLogger ();
183
+ LambdaRequestHandler lambdaRequestHandler = getLambdaRequestHandlerObject (args [0 ], logger );
184
+ startRuntimeLoop (lambdaRequestHandler , logger );
182
185
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 ) {
186
+ } catch (IOException | ClassNotFoundException t ) {
192
187
throw new Error (t );
193
188
}
194
189
}
195
190
196
- private static void startRuntime (String handler , LambdaContextLogger lambdaLogger ) throws Throwable {
191
+ private static LambdaContextLogger initLogger () {
192
+ LogSink logSink = createLogSink ();
193
+ LambdaContextLogger logger = new LambdaContextLogger (
194
+ logSink ,
195
+ LogLevel .fromString (LambdaEnvironment .LAMBDA_LOG_LEVEL ),
196
+ LogFormat .fromString (LambdaEnvironment .LAMBDA_LOG_FORMAT ));
197
+
198
+ return logger ;
199
+ }
200
+
201
+ private static LambdaRequestHandler getLambdaRequestHandlerObject (String handler , LambdaContextLogger lambdaLogger ) throws UnsupportedEncodingException , ClassNotFoundException , IOException {
197
202
UnsafeUtil .disableIllegalAccessWarning ();
198
203
199
204
System .setOut (new PrintStream (new LambdaOutputStream (System .out ), false , "UTF-8" ));
@@ -210,7 +215,7 @@ private static void startRuntime(String handler, LambdaContextLogger lambdaLogge
210
215
Thread .currentThread ().setContextClassLoader (customerClassLoader );
211
216
212
217
// Load the user's handler
213
- LambdaRequestHandler requestHandler ;
218
+ LambdaRequestHandler requestHandler = null ;
214
219
try {
215
220
requestHandler = findRequestHandler (handler , customerClassLoader );
216
221
} catch (UserFault userFault ) {
@@ -220,11 +225,16 @@ private static void startRuntime(String handler, LambdaContextLogger lambdaLogge
220
225
RapidErrorType .BadFunctionCode );
221
226
runtimeClient .reportInitError (error );
222
227
System .exit (1 );
223
- return ;
224
228
}
229
+
225
230
if (INIT_TYPE_SNAP_START .equals (AWS_LAMBDA_INITIALIZATION_TYPE )) {
226
231
onInitComplete (lambdaLogger );
227
232
}
233
+
234
+ return requestHandler ;
235
+ }
236
+
237
+ private static void startRuntimeLoop (LambdaRequestHandler requestHandler , LambdaContextLogger lambdaLogger ) throws Throwable {
228
238
boolean shouldExit = false ;
229
239
while (!shouldExit ) {
230
240
UserFault userFault = null ;
@@ -240,7 +250,7 @@ private static void startRuntime(String handler, LambdaContextLogger lambdaLogge
240
250
payload = requestHandler .call (request );
241
251
runtimeClient .reportInvocationSuccess (request .getId (), payload .toByteArray ());
242
252
// clear interrupted flag in case if it was set by user's code
243
- boolean ignored = Thread .interrupted ();
253
+ Thread .interrupted ();
244
254
} catch (UserFault f ) {
245
255
shouldExit = f .fatal ;
246
256
userFault = f ;
@@ -278,6 +288,7 @@ static void onInitComplete(final LambdaContextLogger lambdaLogger) throws IOExce
278
288
RapidErrorType .BeforeCheckpointError ));
279
289
System .exit (64 );
280
290
}
291
+
281
292
try {
282
293
Core .getGlobalContext ().afterRestore (null );
283
294
} catch (Exception restoreExc ) {
0 commit comments