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 ;
35
36
import java .security .Security ;
36
37
import java .util .Properties ;
37
38
38
-
39
39
/**
40
40
* The entrypoint of this class is {@link AWSLambda#startRuntime}. It performs two main tasks:
41
41
*
@@ -137,6 +137,42 @@ private static LambdaRequestHandler findRequestHandler(final String handlerStrin
137
137
return requestHandler ;
138
138
}
139
139
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
+
140
176
public static void setupRuntimeLogger (LambdaLogger lambdaLogger )
141
177
throws ClassNotFoundException {
142
178
ReflectUtil .setStaticField (
@@ -176,55 +212,27 @@ private static LogSink createLogSink() {
176
212
}
177
213
}
178
214
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 );
182
219
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 ) {
192
221
throw new Error (t );
193
222
}
194
223
}
195
224
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 ) );
202
231
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
+ }
211
234
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 {
228
236
boolean shouldExit = false ;
229
237
while (!shouldExit ) {
230
238
UserFault userFault = null ;
@@ -240,7 +248,7 @@ private static void startRuntime(String handler, LambdaContextLogger lambdaLogge
240
248
payload = requestHandler .call (request );
241
249
runtimeClient .reportInvocationSuccess (request .getId (), payload .toByteArray ());
242
250
// clear interrupted flag in case if it was set by user's code
243
- boolean ignored = Thread .interrupted ();
251
+ Thread .interrupted ();
244
252
} catch (UserFault f ) {
245
253
shouldExit = f .fatal ;
246
254
userFault = f ;
@@ -278,6 +286,7 @@ static void onInitComplete(final LambdaContextLogger lambdaLogger) throws IOExce
278
286
RapidErrorType .BeforeCheckpointError ));
279
287
System .exit (64 );
280
288
}
289
+
281
290
try {
282
291
Core .getGlobalContext ().afterRestore (null );
283
292
} catch (Exception restoreExc ) {
0 commit comments