This is an automated email from the ASF dual-hosted git repository.

cshannon pushed a commit to branch activemq-5.18.x
in repository https://gitbox.apache.org/repos/asf/activemq.git


The following commit(s) were added to refs/heads/activemq-5.18.x by this push:
     new dc892d3df AMQ-9330 - Return 204 code when polling empty destinations 
(#1203)
dc892d3df is described below

commit dc892d3dfc2f4b7d0402d947f40431ce4e50d92d
Author: Christopher L. Shannon <[email protected]>
AuthorDate: Thu Apr 11 09:59:46 2024 -0400

    AMQ-9330 - Return 204 code when polling empty destinations (#1203)
    
    Previously a timeout was thrown and complete was not called so Jetty was
    returning a 500 error
    
    (cherry picked from commit 8b6072d03e273b02288e71cac6eef0539c48ea02)
    (cherry picked from commit 45a1bd54d3e1202d775388cf5b7d63e4c96183a5)
---
 .../java/org/apache/activemq/web/RestTest.java     | 40 +++++++++++-----------
 .../activemq/web/async/AsyncServletRequest.java    | 13 +++++++
 2 files changed, 33 insertions(+), 20 deletions(-)

diff --git 
a/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java 
b/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java
index 9319601e9..2bbea2270 100644
--- a/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java
+++ b/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java
@@ -21,7 +21,9 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.jms.TextMessage;
@@ -52,10 +54,10 @@ public class RestTest extends JettyTestSupport {
         httpClient.start();
 
         final StringBuffer buf = new StringBuffer();
-        final CountDownLatch latch =
+        final Future<Result> result =
                 asyncRequest(httpClient, "http://localhost:"; + port + 
"/message/test?readTimeout=1000&type=queue", buf);
 
-        latch.await();
+        assertEquals(HttpStatus.OK_200, 
result.get().getResponse().getStatus());
         assertEquals("test", buf.toString());
     }
 
@@ -66,7 +68,7 @@ public class RestTest extends JettyTestSupport {
         httpClient.start();
 
         final StringBuffer buf = new StringBuffer();
-        final CountDownLatch latch =
+        final Future<Result> result =
             asyncRequest(httpClient, "http://localhost:"; + port + 
"/message/test?readTimeout=5000&type=queue", buf);
 
         //Sleep 2 seconds before sending, should still get the response as 
timeout is 5 seconds
@@ -74,7 +76,7 @@ public class RestTest extends JettyTestSupport {
         producer.send(session.createTextMessage("test"));
         LOG.info("message sent");
 
-        latch.await();
+        assertEquals(HttpStatus.OK_200, 
result.get().getResponse().getStatus());
         assertEquals("test", buf.toString());
     }
 
@@ -85,12 +87,11 @@ public class RestTest extends JettyTestSupport {
         httpClient.start();
 
         final StringBuffer buf = new StringBuffer();
-        final CountDownLatch latch =
+        final Future<Result> result =
             asyncRequest(httpClient, "http://localhost:"; + port + 
"/message/test?readTimeout=1000&type=queue", buf);
 
         //Test timeout, no message was sent
-        latch.await();
-        assertTrue(buf.toString().contains("AsyncContext timeout"));
+        assertEquals(HttpStatus.NO_CONTENT_204, 
result.get().getResponse().getStatus());
     }
 
     @Test(timeout = 60 * 1000)
@@ -101,13 +102,13 @@ public class RestTest extends JettyTestSupport {
         httpClient.start();
 
         final StringBuffer buf = new StringBuffer();
-        final CountDownLatch latch =
+        final Future<Result> result =
                 asyncRequest(httpClient, "http://localhost:"; + port + 
"/message/test?readTimeout=5000&type=queue", buf);
 
         producer.send(session.createTextMessage("test"));
         LOG.info("message sent");
 
-        latch.await();
+        assertEquals(HttpStatus.OK_200, 
result.get().getResponse().getStatus());
         assertEquals("test", buf.toString());
 
     }
@@ -163,12 +164,11 @@ public class RestTest extends JettyTestSupport {
             producer.send(message);
 
             final StringBuffer buf = new StringBuffer();
-            final CountDownLatch latch =
+            final Future<Result> result =
                     asyncRequest(httpClient, "http://localhost:"; + port + 
"/message/test?readTimeout=1000&type=queue&clientId=test", buf);
 
-            latch.await();
-            LOG.info("Received: " +  buf.toString());
-           // assertEquals(200, contentExchange.getResponseStatus());
+            assertEquals(HttpStatus.OK_200, 
result.get().getResponse().getStatus());
+            LOG.info("Received: " +  buf);
             assertEquals(correlId,  buf.toString());
         }
         httpClient.stop();
@@ -183,11 +183,11 @@ public class RestTest extends JettyTestSupport {
         httpClient.start();
 
         final StringBuffer buf = new StringBuffer();
-        final CountDownLatch latch =
+        final Future<Result> result =
                 asyncRequest(httpClient, "http://localhost:"; + port + 
"/message/test?readTimeout=1000&type=queue&clientId=test", buf);
 
-        latch.await();
-        LOG.info("Received: " + buf.toString());
+        assertEquals(HttpStatus.OK_200, 
result.get().getResponse().getStatus());
+        LOG.info("Received: " + buf);
 
         final StringBuffer buf2 = new StringBuffer();
         final CountDownLatch latch2 = new CountDownLatch(1);
@@ -315,16 +315,16 @@ public class RestTest extends JettyTestSupport {
         assertTrue("success status", HttpStatus.isSuccess(status.get()));
     }
 
-    protected CountDownLatch asyncRequest(final HttpClient httpClient, final 
String url, final StringBuffer buffer) {
-        final CountDownLatch latch = new CountDownLatch(1);
+    protected Future<Result> asyncRequest(final HttpClient httpClient, final 
String url, final StringBuffer buffer) {
+        final CompletableFuture<Result> futureResult = new 
CompletableFuture<>();
         httpClient.newRequest(url).send(new BufferingResponseListener() {
             @Override
             public void onComplete(Result result) {
                 buffer.append(getContentAsString());
-                latch.countDown();
+                futureResult.complete(result);
             }
         });
-        return latch;
+        return futureResult;
     }
 
     protected CountDownLatch asyncRequest(final HttpClient httpClient, final 
String url, final StringBuffer buffer,
diff --git 
a/activemq-web/src/main/java/org/apache/activemq/web/async/AsyncServletRequest.java
 
b/activemq-web/src/main/java/org/apache/activemq/web/async/AsyncServletRequest.java
index 79aa3fb06..2598332e4 100644
--- 
a/activemq-web/src/main/java/org/apache/activemq/web/async/AsyncServletRequest.java
+++ 
b/activemq-web/src/main/java/org/apache/activemq/web/async/AsyncServletRequest.java
@@ -27,6 +27,8 @@ import javax.servlet.AsyncListener;
 import javax.servlet.DispatcherType;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletRequestWrapper;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -111,6 +113,17 @@ public class AsyncServletRequest implements AsyncListener  
{
         if (LOG.isDebugEnabled()) {
             LOG.debug("ActiveMQAsyncRequest " + event + " timeout.");
         }
+
+        final AsyncContext context = event.getAsyncContext();
+        if (context != null) {
+            // We must call complete and then set the status code to prevent a 
500
+            // error. The spec requires a 500 error on timeout unless 
complete() is called.
+            context.complete();
+            final ServletResponse response = context.getResponse();
+            if (response instanceof HttpServletResponse) {
+                ((HttpServletResponse) 
response).setStatus(HttpServletResponse.SC_NO_CONTENT);
+            }
+        }
     }
 
     @Override

Reply via email to