有没有一种方法可以钩入Lambda的关闭?我正在打开数据库连接,希望保持它的打开状态,但是我想确保在Lambda终止时关闭它。
有没有一种方法可以钩入Lambda的关闭?我正在打开数据库连接,希望保持它的打开状态,但是我想确保在Lambda终止时关闭它。
您可能对Lambda实例在被终止时抛出的事件感兴趣,而不是单个调用结束时抛出的事件,对吗?虽然您有一种选项可以同时使用,但我怀疑它们会帮助您。
您可以使用上下文方法getRemainingTimeInMillis()
(链接到Node.js,但其他编程语言类似)来查找当前Lambda函数调用何时超时。这可能有助于清理事物或充分利用Lambda函数的时间。我不建议在每次调用结束时清理数据库连接,因为这样您将无法重用它们进行未来的调用,这会减慢Lambda函数的速度。但是,如果您可以接受这种情况,请继续。请记住,只要您的函数正在运行,这仅起作用。一旦您返回响应,您就无法执行任何清理操作,因为您的Lambda函数将进入“睡眠模式”。您需要在返回内容之前执行此操作。
或者,您可以利用扩展API。 它提供了一个关闭阶段并触发一个带有Shutdown
事件的扩展。 但是,由于扩展坐落在您的函数旁边(而不是在您的函数代码中),我不确定您是否有机会使用此方法清理任何数据库连接... 另请参见Lambda执行环境以获取更多信息。
假设您拥有一个用于热Lambda的池化连接,您可以注册一个关闭钩子来关闭DB连接或释放任何其他资源,您只有500毫秒来执行此任务。
class EnvironmentConfig {
private static volatile boolean shutdownRegistered;
private static volatile HikariDataSource ds;
private void registerShudownHook() {
if (!shutdownRegistered) {
synchronized (lock) {
if (!shutdownRegistered) {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
if (ds != null) {
ds.close();
}
}));
EnvironmentConfig.shutdownRegistered = true;
}
}
}
}
public DataSource dataSource() throws PropertyVetoException {
HikariDataSource _ds = EnvironmentConfig.ds;
if (_ds == null) {
synchronized (lock) {
_ds = EnvironmentConfig.ds;
if (_ds == null) {
_ds = new HikariDataSource();
// TODO: set connection props
EnvironmentConfig.ds = _ds;
registerShudownHook();
}
}
}
return _ds;
}
}
您可以在任何地方引用数据源以获取单例副本,该副本将创建实例并注册关闭挂钩。
您的关闭挂钩可以执行其他任务,只要它们快速完成,或者您可以注册多个挂钩,但不要过多地注册线程。
不,您无法钩入Lambda执行上下文的关闭。
Lambda会自行处理并决定何时重用或销毁执行上下文。
您可能需要依靠连接自行超时。