Skip to content

Commit 2cca953

Browse files
IAM20Myeonghyeon-Lee
authored andcommitted
Fix possible thread leak
1 parent 8d1263c commit 2cca953

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

spring-data-jdbc-plus-sql/src/main/java/com/navercorp/spring/data/jdbc/plus/sql/support/template/JdbcReactiveTemplate.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public <R> Flux<R> queryFlux(
183183
BlockingQueue<FluxItem<R>> queue = new LinkedBlockingQueue<>(queueSize);
184184
AtomicBoolean isClosed = new AtomicBoolean(false);
185185

186-
return generateFluxFromQueue(queue, isClosed)
186+
return generateFluxFromQueue(queue, bufferTimeout, isClosed)
187187
.doOnCancel(() -> isClosed.set(true))
188188
.doFirst(() -> scheduler.schedule(() -> {
189189
try {
@@ -201,9 +201,13 @@ public void processRow(ResultSet resultSet, int rowNum) throws SQLException {
201201
} catch (UncategorizedSQLException e) {
202202
/* Sort of db timeout. */
203203
isClosed.set(true);
204+
insertToBlockingQueue(queue, endItem(), isClosed, bufferTimeout);
205+
logger.error("Failed to generate flux.", e);
204206
return;
205207
} catch (Exception e) {
206208
isClosed.set(true);
209+
insertToBlockingQueue(queue, endItem(), isClosed, bufferTimeout);
210+
logger.error("Failed to generate flux.", e);
207211
throw e; /* To propagate exception to subscriber */
208212
}
209213

@@ -223,7 +227,7 @@ private <R> void insertToBlockingQueue(
223227
if (!queue.offer(item, bufferTimeout, TimeUnit.MILLISECONDS)) {
224228
/* Close the flux. */
225229
isClosed.set(true);
226-
throw new TimeoutException("Can't insert into blocking queue.");
230+
throw new TimeoutException("Cannot insert into blocking queue.");
227231
}
228232
} catch (InterruptedException e) {
229233
Thread.currentThread().interrupt();
@@ -234,7 +238,7 @@ private <R> void insertToBlockingQueue(
234238
}
235239

236240
private <R> Flux<R> generateFluxFromQueue(
237-
BlockingQueue<FluxItem<R>> queue, AtomicBoolean isClosed) {
241+
BlockingQueue<FluxItem<R>> queue, long bufferTimeout, AtomicBoolean isClosed) {
238242

239243
return Flux.generate(sink -> {
240244
if (isClosed.get()) {
@@ -243,7 +247,12 @@ private <R> Flux<R> generateFluxFromQueue(
243247
"Database Connection is closed."));
244248
}
245249
try {
246-
FluxItem<R> row = queue.take();
250+
FluxItem<R> row = queue.poll(bufferTimeout, TimeUnit.MILLISECONDS);
251+
if (row == null) {
252+
sink.error(new DataAccessResourceFailureException(
253+
"Cannot take element from blocking queue."));
254+
return;
255+
}
247256
if (row.isEnd()) {
248257
sink.complete();
249258
return;

0 commit comments

Comments
 (0)