You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2015/10/12 15:49:08 UTC

[2/3] qpid-jms git commit: QPIDJMS-124: have the peer send a Close frame with the exception details before it breaks out of the process loop

QPIDJMS-124: have the peer send a Close frame with the exception details before it breaks out of the process loop


Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/a7a317d6
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/a7a317d6
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/a7a317d6

Branch: refs/heads/master
Commit: a7a317d6420bfab71bb02f268c09a213d15c9c94
Parents: 9cf75e8
Author: Robert Gemmell <ro...@apache.org>
Authored: Mon Oct 12 12:25:55 2015 +0100
Committer: Robert Gemmell <ro...@apache.org>
Committed: Mon Oct 12 14:47:27 2015 +0100

----------------------------------------------------------------------
 .../qpid/jms/test/testpeer/TestAmqpPeer.java    | 42 ++++++++++----------
 .../jms/test/testpeer/TestAmqpPeerRunner.java   | 15 ++++++-
 2 files changed, 36 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/a7a317d6/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java
index 40bab4e..34d7c34 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java
@@ -581,18 +581,10 @@ public class TestAmqpPeer implements AutoCloseable
         expectSaslAnonymousConnect(null, null, null, serverProperties);
 
         // Now generate the Close frame with the supplied error
-        final CloseFrame closeFrame = new CloseFrame();
-        if (errorType != null) {
-            org.apache.qpid.jms.test.testpeer.describedtypes.Error detachError = new org.apache.qpid.jms.test.testpeer.describedtypes.Error();
-            detachError.setCondition(errorType);
-            detachError.setDescription(errorMessage);
-            detachError.setInfo(errorInfo);
-            closeFrame.setError(detachError);
-        }
+        final FrameSender closeSender = createCloseFrameSender(errorType, errorMessage, errorInfo);
 
         // Update the handler to send the Close frame after the Open frame.
         CompositeAmqpPeerRunnable comp = insertCompsiteActionForLastHandler();
-        final FrameSender closeSender = new FrameSender(this, FrameType.AMQP, CONNECTION_CHANNEL, closeFrame, null);
         comp.add(closeSender);
 
         addHandler(new CloseMatcher().withError(Matchers.nullValue()));
@@ -1527,18 +1519,9 @@ public class TestAmqpPeer implements AutoCloseable
             CompositeAmqpPeerRunnable comp = insertCompsiteActionForLastHandler();
 
             // Now generate the Close
-            final CloseFrame closeFrame = new CloseFrame();
-            if (errorType != null) {
-                org.apache.qpid.jms.test.testpeer.describedtypes.Error detachError = new org.apache.qpid.jms.test.testpeer.describedtypes.Error();
-                detachError.setCondition(errorType);
-                detachError.setDescription(errorMessage);
-                detachError.setInfo(info);
-                closeFrame.setError(detachError);
-            }
+            final FrameSender closeSender = createCloseFrameSender(errorType, errorMessage, info);
 
-            final FrameSender frameSender = new FrameSender(this, FrameType.AMQP, CONNECTION_CHANNEL, closeFrame, null);
-
-            comp.add(frameSender);
+            comp.add(closeSender);
 
             if (expectCloseResponse) {
                 // Expect a response to our Close.
@@ -1548,6 +1531,25 @@ public class TestAmqpPeer implements AutoCloseable
         }
     }
 
+    private FrameSender createCloseFrameSender(Symbol errorType, String errorMessage, Map<Symbol, Object> info) {
+        final CloseFrame closeFrame = new CloseFrame();
+        if (errorType != null) {
+            org.apache.qpid.jms.test.testpeer.describedtypes.Error closeError = new org.apache.qpid.jms.test.testpeer.describedtypes.Error();
+            closeError.setCondition(errorType);
+            closeError.setDescription(errorMessage);
+            closeError.setInfo(info);
+
+            closeFrame.setError(closeError);
+        }
+
+        return new FrameSender(this, FrameType.AMQP, CONNECTION_CHANNEL, closeFrame, null);
+    }
+
+    void sendConnectionCloseImmediately(Symbol errorType, String errorMessage) {
+        FrameSender closeSender = createCloseFrameSender(errorType, errorMessage, null);
+        closeSender.run();
+    }
+
     public void remotelyDetachLastOpenedLinkOnLastOpenedSession(boolean expectDetachResponse, boolean closed) {
         remotelyDetachLastOpenedLinkOnLastOpenedSession(expectDetachResponse, closed, null, null);
     }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/a7a317d6/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeerRunner.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeerRunner.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeerRunner.java
index 854e64c..9dfdedc 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeerRunner.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeerRunner.java
@@ -29,6 +29,7 @@ import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLServerSocket;
 import javax.net.ssl.SSLServerSocketFactory;
 
+import org.apache.qpid.jms.test.testpeer.basictypes.AmqpError;
 import org.apache.qpid.proton.amqp.Binary;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -46,6 +47,7 @@ class TestAmqpPeerRunner implements Runnable
     private OutputStream _networkOutputStream;
 
     private final Object _inputHandlingLock = new Object();
+    private final TestAmqpPeer _peer;
     private final TestFrameParser _testFrameParser;
     private volatile boolean _suppressReadExceptionOnClose;
     private volatile boolean _exitReadLoopEarly;
@@ -76,6 +78,7 @@ class TestAmqpPeerRunner implements Runnable
         }
 
         _testFrameParser = new TestFrameParser(peer);
+        _peer = peer;
     }
 
     @Override
@@ -107,7 +110,17 @@ class TestAmqpPeerRunner implements Runnable
 
                     LOGGER.debug("Read: {}", new Binary(networkInputBytes, 0, bytesRead));
 
-                    _testFrameParser.input(networkInputByteBuffer);
+                    try {
+                        _testFrameParser.input(networkInputByteBuffer);
+                    } catch (Exception ex) {
+                        try {
+                            _peer.sendConnectionCloseImmediately(AmqpError.INTERNAL_ERROR, "Problem in peer: " + ex);
+                        } catch (Exception ex2) {
+                            LOGGER.debug("Exception while sending close frame during handling of previous exception", ex2);
+                        }
+
+                        throw ex;
+                    }
                 }
 
                 if(_exitReadLoopEarly)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org