@@ -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