package org.openamq.client.handler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.openamq.AMQException;
import org.openamq.AMQConnectionClosedException;
import org.openamq.client.protocol.AMQMethodEvent;
import org.openamq.client.state.AMQState;
import org.openamq.client.state.AMQStateManager;
import org.openamq.client.state.StateAwareMethodListener;
import org.openamq.framing.ConnectionCloseBody;
import org.openamq.framing.ConnectionCloseOkBody;
public class ConnectionCloseMethodHandler implements StateAwareMethodListener
{
private static final Logger _logger = LoggerFactory.getLogger(ConnectionCloseMethodHandler.class);
private static ConnectionCloseMethodHandler _handler = new ConnectionCloseMethodHandler();
public static ConnectionCloseMethodHandler getInstance()
{
return _handler;
}
private ConnectionCloseMethodHandler()
{
}
public void methodReceived(AMQStateManager stateManager, AMQMethodEvent evt) throws AMQException
{
_logger.debug("ConnectionClose frame received");
ConnectionCloseBody method = (ConnectionCloseBody) evt.getMethod();
int errorCode = method.replyCode;
String reason = method.replyText;
// TODO: check whether channel id of zero is appropriate
evt.getProtocolSession().writeFrame(ConnectionCloseOkBody.createAMQFrame((short)0));
stateManager.changeState(AMQState.CONNECTION_CLOSED);
if (errorCode != 200)
{
_logger.debug("Connection close received with error code " + errorCode);
throw new AMQConnectionClosedException(errorCode, "Error: " + reason);
}
// this actually closes the connection in the case where it is not an error.
evt.getProtocolSession().closeProtocolSession();
}
}