|
17 | 17 | package software.amazon.jdbc.util.monitoring; |
18 | 18 |
|
19 | 19 | import java.sql.SQLException; |
| 20 | +import java.util.ArrayList; |
20 | 21 | import java.util.Collections; |
21 | 22 | import java.util.HashMap; |
22 | 23 | import java.util.HashSet; |
| 24 | +import java.util.List; |
23 | 25 | import java.util.Map; |
24 | 26 | import java.util.Properties; |
25 | 27 | import java.util.Set; |
@@ -197,25 +199,38 @@ public <T extends Monitor> T runIfAbsent( |
197 | 199 | cacheContainer = monitorCaches.computeIfAbsent(monitorClass, k -> supplier.get()); |
198 | 200 | } |
199 | 201 |
|
200 | | - final ConnectionService connectionService = |
201 | | - getConnectionService( |
202 | | - storageService, |
203 | | - telemetryFactory, |
204 | | - defaultConnectionProvider, |
205 | | - originalUrl, |
206 | | - driverProtocol, |
207 | | - driverDialect, |
208 | | - dbDialect, |
209 | | - originalProps); |
210 | | - |
211 | | - Monitor monitor = cacheContainer.getCache().computeIfAbsent(key, k -> { |
212 | | - MonitorItem monitorItem = new MonitorItem(() -> initializer.createMonitor( |
213 | | - connectionService, |
214 | | - connectionService.getPluginService())); |
215 | | - monitorItem.getMonitor().start(); |
216 | | - return monitorItem; |
217 | | - }).getMonitor(); |
| 202 | + // Lambdas require references to outer variables to be final. We use this variable to check whether a SQLException |
| 203 | + // occurred while attempting to create the monitor. |
| 204 | + final List<SQLException> exceptionList = new ArrayList<>(1); |
| 205 | + MonitorItem monitorItem = cacheContainer.getCache().computeIfAbsent(key, k -> { |
| 206 | + try { |
| 207 | + final ConnectionService connectionService = |
| 208 | + getConnectionService( |
| 209 | + storageService, |
| 210 | + telemetryFactory, |
| 211 | + defaultConnectionProvider, |
| 212 | + originalUrl, |
| 213 | + driverProtocol, |
| 214 | + driverDialect, |
| 215 | + dbDialect, |
| 216 | + originalProps); |
| 217 | + final MonitorItem monitorItemInner = new MonitorItem(() -> initializer.createMonitor( |
| 218 | + connectionService, |
| 219 | + connectionService.getPluginService()) |
| 220 | + ); |
| 221 | + monitorItemInner.getMonitor().start(); |
| 222 | + return monitorItemInner; |
| 223 | + } catch (SQLException e) { |
| 224 | + exceptionList.add(e); |
| 225 | + return null; |
| 226 | + } |
| 227 | + }); |
| 228 | + |
| 229 | + if (!exceptionList.isEmpty()) { |
| 230 | + throw exceptionList.get(0); |
| 231 | + } |
218 | 232 |
|
| 233 | + Monitor monitor = monitorItem.getMonitor(); |
219 | 234 | if (monitorClass.isInstance(monitor)) { |
220 | 235 | return monitorClass.cast(monitor); |
221 | 236 | } |
|
0 commit comments