diff options
author | Martin Ritchie <ritchiem@apache.org> | 2007-02-19 14:48:44 +0000 |
---|---|---|
committer | Martin Ritchie <ritchiem@apache.org> | 2007-02-19 14:48:44 +0000 |
commit | e14993ebab6c2f2ed5984de30fe03ce320cf4c0c (patch) | |
tree | f3f700b337b81b6c8a4d2b0a7eafbe86c57c98d6 | |
parent | ef65342bbda798f5ecdcc70ef1919d3b3d0300f5 (diff) | |
download | qpid-python-e14993ebab6c2f2ed5984de30fe03ce320cf4c0c.tar.gz |
Fully propogated timeouts during AMQConnection.close. Still needs timeouts to be reduced between the various session closures. QPID-380
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@509216 13f79535-47bb-0310-9956-ffa450edef68
4 files changed, 12 insertions, 104 deletions
diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java index 1fb1c51890..03a70d7f39 100644 --- a/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java +++ b/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java @@ -725,7 +725,7 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect long startCloseTime = System.currentTimeMillis(); _taskPool.shutdown(); - closeAllSessions(null, timeout); + closeAllSessions(null, timeout, startCloseTime); if (!_taskPool.isTerminated()) { @@ -734,7 +734,7 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect //adjust timeout long taskPoolTimeout = adjustTimeout(timeout, startCloseTime); - _taskPool.awaitTermination(taskPoolTimeout , TimeUnit.MILLISECONDS); + _taskPool.awaitTermination(taskPoolTimeout, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { @@ -791,7 +791,7 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect * @param cause if not null, the error that is causing this shutdown <p/> The caller must hold the failover mutex * before calling this method. */ - private void closeAllSessions(Throwable cause, long timeout) throws JMSException + private void closeAllSessions(Throwable cause, long timeout, long starttime) throws JMSException { final LinkedList sessionCopy = new LinkedList(_sessions.values()); final Iterator it = sessionCopy.iterator(); @@ -807,6 +807,11 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect { try { + if (starttime != -1) + { + timeout = adjustTimeout(timeout, starttime); + } + session.close(timeout); } catch (JMSException e) @@ -1065,7 +1070,7 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect _logger.info("Closing AMQConnection due to :" + cause.getMessage()); } _closed.set(true); - closeAllSessions(cause, -1); // FIXME: when doing this end up with RejectedExecutionException from executor. + closeAllSessions(cause, -1, -1); // FIXME: when doing this end up with RejectedExecutionException from executor. } catch (JMSException e) { diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQSession.java b/java/client/src/main/java/org/apache/qpid/client/AMQSession.java index fe77acfabc..6d4d6cbaad 100644 --- a/java/client/src/main/java/org/apache/qpid/client/AMQSession.java +++ b/java/client/src/main/java/org/apache/qpid/client/AMQSession.java @@ -521,7 +521,8 @@ public class AMQSession extends Closeable implements Session, QueueSession, Topi 0, // methodId AMQConstant.REPLY_SUCCESS.getCode(), // replyCode new AMQShortString("JMS client closing channel")); // replyText - getProtocolHandler().syncWrite(frame, ChannelCloseOkBody.class); + + getProtocolHandler().syncWrite(frame, ChannelCloseOkBody.class, timeout); // When control resumes at this point, a reply will have been received that // indicates the broker has closed the channel successfully diff --git a/java/client/src/test/java/org/apache/qpid/client/DispatcherTest.java b/java/client/src/test/java/org/apache/qpid/client/DispatcherTest.java index a29ba7acd7..cf26a54f1b 100644 --- a/java/client/src/test/java/org/apache/qpid/client/DispatcherTest.java +++ b/java/client/src/test/java/org/apache/qpid/client/DispatcherTest.java @@ -83,7 +83,7 @@ public class DispatcherTest extends TestCase Hashtable<String, String> env = new Hashtable<String, String>(); env.put("connectionfactory.connection", "amqp://client:client@MLT_ID/test?brokerlist='vm://:1'"); - env.put("queue.queue", "direct://amq.direct//MessageListenerTest"); + env.put("queue.queue", "MessageListenerTest"); _context = factory.getInitialContext(env); diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/client/channelclose/TestChannelCloseMethodHandlerNoCloseOk.java b/java/client/src/test/java/org/apache/qpid/test/unit/client/channelclose/TestChannelCloseMethodHandlerNoCloseOk.java deleted file mode 100644 index 69cbdd6a09..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/client/channelclose/TestChannelCloseMethodHandlerNoCloseOk.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - * - */ -package org.apache.qpid.test.unit.client.channelclose; - -import org.apache.log4j.Logger; -import org.apache.qpid.client.state.AMQStateManager; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.AMQNoConsumersException; -import org.apache.qpid.client.AMQNoRouteException; -import org.apache.qpid.protocol.AMQMethodEvent; -import org.apache.qpid.protocol.AMQConstant; -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQInvalidSelectorException; -import org.apache.qpid.AMQInvalidRoutingKeyException; -import org.apache.qpid.AMQChannelClosedException; -import org.apache.qpid.framing.ChannelCloseBody; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.AMQFrame; -import org.apache.qpid.framing.ChannelCloseOkBody; - -public class TestChannelCloseMethodHandlerNoCloseOk implements StateAwareMethodListener -{ - private static final Logger _logger = Logger.getLogger(TestChannelCloseMethodHandlerNoCloseOk.class); - - private static TestChannelCloseMethodHandlerNoCloseOk _handler = new TestChannelCloseMethodHandlerNoCloseOk(); - - public static TestChannelCloseMethodHandlerNoCloseOk getInstance() - { - return _handler; - } - - public void methodReceived(AMQStateManager stateManager, AMQProtocolSession protocolSession, AMQMethodEvent evt) throws AMQException - { - _logger.debug("ChannelClose method received"); - ChannelCloseBody method = (ChannelCloseBody) evt.getMethod(); - - AMQConstant errorCode = AMQConstant.getConstant(method.replyCode); - AMQShortString reason = method.replyText; - if (_logger.isDebugEnabled()) - { - _logger.debug("Channel close reply code: " + errorCode + ", reason: " + reason); - } - - // For this test Method Handler .. don't send Close-OK -// // TODO: Be aware of possible changes to parameter order as versions change. -// AMQFrame frame = ChannelCloseOkBody.createAMQFrame(evt.getChannelId(), method.getMajor(), method.getMinor()); -// protocolSession.writeFrame(frame); - if (errorCode != AMQConstant.REPLY_SUCCESS) - { - _logger.error("Channel close received with errorCode " + errorCode + ", and reason " + reason); - if (errorCode == AMQConstant.NO_CONSUMERS) - { - throw new AMQNoConsumersException("Error: " + reason, null); - } - else if (errorCode == AMQConstant.NO_ROUTE) - { - throw new AMQNoRouteException("Error: " + reason, null); - } - else if (errorCode == AMQConstant.INVALID_SELECTOR) - { - _logger.debug("Broker responded with Invalid Selector."); - - throw new AMQInvalidSelectorException(String.valueOf(reason)); - } - else if (errorCode == AMQConstant.INVALID_ROUTING_KEY) - { - _logger.debug("Broker responded with Invalid Routing Key."); - - throw new AMQInvalidRoutingKeyException(String.valueOf(reason)); - } - else - { - throw new AMQChannelClosedException(errorCode, "Error: " + reason); - } - - } - protocolSession.channelClosed(evt.getChannelId(), errorCode, String.valueOf(reason)); - } -}
\ No newline at end of file |