AWS Athena UDF - 访问 lambda 上下文
AWS Athena UDF - access to lambda context
是否可以从我正在实施的 AWS Athena UDF 中访问 AWS lambda 上下文?
public class MyUserDefinedFunctions
extends UserDefinedFunctionHandler{
...
// access to lambda context ?
}
您可以覆盖 handleRequest,并将传递的上下文保存在实例字段中,以供您的实现稍后使用。请务必在覆盖中调用 super.handleRequest
,否则您的实现将无法正常工作。
以上将不起作用,因为 handleRequest
是最终的。但是我们可以使用委托模式来做类似的事情。首先,实现 MyUserDefinedFunction
以便它在构造函数中使用 Context
,它可以存储起来 ...
public class MyUserDefinedFunction
extends UserDefinedFunctionHandler{
public MyUserDefinedFunction(String sourceType, Context context)
{
super(sourceType);
this.context = context;
}
// ... other methods can now refer to this.context
}
然后创建一个新的简单处理程序,它直接实现 RequestStreamHandler
接口,并在每个请求上创建一个 MyUserDefinedFunction
的实例,调用它的 handleRequest
方法。
public class MyHandler implements RequestStreamHandler {
@Override
public final void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
MyUserDefinedFunction("sourceType", context).handleRequest(inputStream, outputStream, context);
}
}
然后 MyHandler
成为您实际的 Lambda 处理程序。如果 UserDefinedFunctionHandler
消耗了大量资源来实例化,那么这可能不是最好的主意,但是看看 source,构造函数真正做的就是存储 sourceType
,所以我不不要认为您正在查看在每个请求上实例化它的任何实际开销。
是否可以从我正在实施的 AWS Athena UDF 中访问 AWS lambda 上下文?
public class MyUserDefinedFunctions
extends UserDefinedFunctionHandler{
...
// access to lambda context ?
}
您可以覆盖 handleRequest,并将传递的上下文保存在实例字段中,以供您的实现稍后使用。请务必在覆盖中调用 super.handleRequest
,否则您的实现将无法正常工作。
以上将不起作用,因为 handleRequest
是最终的。但是我们可以使用委托模式来做类似的事情。首先,实现 MyUserDefinedFunction
以便它在构造函数中使用 Context
,它可以存储起来 ...
public class MyUserDefinedFunction
extends UserDefinedFunctionHandler{
public MyUserDefinedFunction(String sourceType, Context context)
{
super(sourceType);
this.context = context;
}
// ... other methods can now refer to this.context
}
然后创建一个新的简单处理程序,它直接实现 RequestStreamHandler
接口,并在每个请求上创建一个 MyUserDefinedFunction
的实例,调用它的 handleRequest
方法。
public class MyHandler implements RequestStreamHandler {
@Override
public final void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
MyUserDefinedFunction("sourceType", context).handleRequest(inputStream, outputStream, context);
}
}
然后 MyHandler
成为您实际的 Lambda 处理程序。如果 UserDefinedFunctionHandler
消耗了大量资源来实例化,那么这可能不是最好的主意,但是看看 source,构造函数真正做的就是存储 sourceType
,所以我不不要认为您正在查看在每个请求上实例化它的任何实际开销。