From de562deab00d0a8cfbfc64da729bd784292df10c Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 21 Mar 2026 12:04:00 +0100 Subject: [PATCH 1/3] Recognize error code 149 as deadlock loser (MySQL Galera) Closes gh-36499 --- .../org/springframework/jdbc/support/sql-error-codes.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-jdbc/src/main/resources/org/springframework/jdbc/support/sql-error-codes.xml b/spring-jdbc/src/main/resources/org/springframework/jdbc/support/sql-error-codes.xml index e8c892d07ad..11623bd35a8 100644 --- a/spring-jdbc/src/main/resources/org/springframework/jdbc/support/sql-error-codes.xml +++ b/spring-jdbc/src/main/resources/org/springframework/jdbc/support/sql-error-codes.xml @@ -209,7 +209,7 @@ 1205,3572 - 1213 + 149,1213 From 4c854d564c1e7902d048d7efae4ac261a521d1fe Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 21 Mar 2026 12:04:29 +0100 Subject: [PATCH 2/3] Avoid endless re-interruption loop on shutdown Closes gh-36506 --- .../jms/listener/DefaultMessageListenerContainer.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java index 5b5d47bd1bc..c5fadfc6e26 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java @@ -735,14 +735,20 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe long receiveTimeout = getReceiveTimeout(); long waitStartTime = System.currentTimeMillis(); int waitCount = 0; + boolean interrupted = false; while (this.activeInvokerCount > 0) { if (waitCount > 0 && !isAcceptMessagesWhileStopping() && System.currentTimeMillis() - waitStartTime >= receiveTimeout) { // Unexpectedly some invokers are still active after the receive timeout period // -> interrupt remaining receive attempts since we'd reject the messages anyway + if (interrupted) { + // Already interrupted -> not worth waiting any longer... + break; + } for (AsyncMessageListenerInvoker scheduledInvoker : this.scheduledInvokers) { scheduledInvoker.interruptIfNecessary(); } + interrupted = true; } if (logger.isDebugEnabled()) { logger.debug("Still waiting for shutdown of " + this.activeInvokerCount + From 3a35c4dbd03d5aaee860b3235b1ba7aaca51b1a7 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 21 Mar 2026 12:13:39 +0100 Subject: [PATCH 3/3] Consistent IOException spelling in class/method names --- .../mvcannexceptionhandlerexc/ExceptionController.java | 2 +- .../mvcannexceptionhandlerexc/ExceptionController.kt | 2 +- .../web/client/RestTemplateObservationTests.java | 2 +- .../annotation/ExceptionHandlerExceptionResolverTests.java | 4 ++-- .../socket/sockjs/transport/session/SockJsSessionTests.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvccontroller/mvcannexceptionhandlerexc/ExceptionController.java b/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvccontroller/mvcannexceptionhandlerexc/ExceptionController.java index a2de87a9b81..68135ff334f 100644 --- a/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvccontroller/mvcannexceptionhandlerexc/ExceptionController.java +++ b/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvccontroller/mvcannexceptionhandlerexc/ExceptionController.java @@ -29,7 +29,7 @@ public class ExceptionController { // tag::narrow[] @ExceptionHandler({FileSystemException.class, RemoteException.class}) - public ResponseEntity handleIoException(IOException ex) { + public ResponseEntity handleIOException(IOException ex) { return ResponseEntity.internalServerError().body(ex.getMessage()); } // end::narrow[] diff --git a/framework-docs/src/main/kotlin/org/springframework/docs/web/webmvc/mvccontroller/mvcannexceptionhandlerexc/ExceptionController.kt b/framework-docs/src/main/kotlin/org/springframework/docs/web/webmvc/mvccontroller/mvcannexceptionhandlerexc/ExceptionController.kt index dda49e8f08b..2843a077286 100644 --- a/framework-docs/src/main/kotlin/org/springframework/docs/web/webmvc/mvccontroller/mvcannexceptionhandlerexc/ExceptionController.kt +++ b/framework-docs/src/main/kotlin/org/springframework/docs/web/webmvc/mvccontroller/mvcannexceptionhandlerexc/ExceptionController.kt @@ -27,7 +27,7 @@ class ExceptionController { // tag::narrow[] @ExceptionHandler(FileSystemException::class, RemoteException::class) - fun handleIoException(ex: IOException): ResponseEntity { + fun handleIOException(ex: IOException): ResponseEntity { return ResponseEntity.internalServerError().body(ex.message) } // end::narrow[] diff --git a/spring-web/src/test/java/org/springframework/web/client/RestTemplateObservationTests.java b/spring-web/src/test/java/org/springframework/web/client/RestTemplateObservationTests.java index 8ec958df523..442fe5593ce 100644 --- a/spring-web/src/test/java/org/springframework/web/client/RestTemplateObservationTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/RestTemplateObservationTests.java @@ -149,7 +149,7 @@ class RestTemplateObservationTests { } @Test - void executeWithIoExceptionAddsUnknownOutcome() throws Exception { + void executeWithIOExceptionAddsUnknownOutcome() throws Exception { String url = "https://example.org/resource"; mockSentRequest(GET, url); given(request.execute()).willThrow(new IOException("Socket failure")); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolverTests.java index 0f61a24734b..38af2470ce5 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolverTests.java @@ -172,7 +172,7 @@ class ExceptionHandlerExceptionResolverTests { @Test void resolveNoExceptionHandlerForException() throws NoSuchMethodException { Exception npe = new NullPointerException(); - HandlerMethod handlerMethod = new HandlerMethod(new IoExceptionController(), "handle"); + HandlerMethod handlerMethod = new HandlerMethod(new IOExceptionController(), "handle"); this.resolver.afterPropertiesSet(); ModelAndView mav = this.resolver.resolveException(this.request, this.response, handlerMethod, npe); @@ -540,7 +540,7 @@ class ExceptionHandlerExceptionResolverTests { @Controller - static class IoExceptionController { + static class IOExceptionController { public void handle() {} diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/SockJsSessionTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/SockJsSessionTests.java index d12659038a4..14ab2839659 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/SockJsSessionTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/SockJsSessionTests.java @@ -240,7 +240,7 @@ class SockJsSessionTests extends AbstractSockJsSessionTests { } @Test - void writeFrameIoException() throws Exception { + void writeFrameIOException() throws Exception { this.session.setExceptionOnWrite(new IOException()); this.session.delegateConnectionEstablished();