use of org.apache.qpid.server.protocol.v1_0.type.transport.Detach in project qpid-broker-j by apache.
the class ErrantLinkEndpoint method close.
@Override
public void close(final Error error) {
Detach detach = new Detach();
detach.setHandle(_localHandle);
detach.setClosed(true);
detach.setError(error);
_session.sendDetach(detach);
_session.dissociateEndpoint(this);
destroy();
_link.linkClosed();
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Detach in project qpid-broker-j by apache.
the class SendingLinkEndpoint method remoteDetachedPerformDetach.
@Override
protected void remoteDetachedPerformDetach(final Detach detach) {
TerminusExpiryPolicy expiryPolicy = getSource().getExpiryPolicy();
if (Boolean.TRUE.equals(detach.getClosed()) || TerminusExpiryPolicy.LINK_DETACH.equals(expiryPolicy) || ((expiryPolicy == null || TerminusExpiryPolicy.SESSION_END.equals(expiryPolicy)) && getSession().isClosing()) || (TerminusExpiryPolicy.CONNECTION_CLOSE.equals(expiryPolicy) && getSession().getConnection().isClosing())) {
cleanUpUnsettledDeliveries();
close();
} else if (detach.getError() != null) {
cleanUpUnsettledDeliveries();
detach();
destroy();
getConsumerTarget().updateNotifyWorkDesired();
} else {
detach();
// TODO: QPID-7845 : Resuming links is unsupported at the moment. Destroying link unconditionally.
destroy();
getConsumerTarget().updateNotifyWorkDesired();
}
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Detach in project qpid-broker-j by apache.
the class Session_1_0 method receiveDetach.
public void receiveDetach(final Detach detach) {
receivedComplete();
UnsignedInteger handle = detach.getHandle();
detach(handle, detach);
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Detach in project qpid-broker-j by apache.
the class Session_1_0Test method testReceiveReattachRebindingQueueNoActiveLinks.
public void testReceiveReattachRebindingQueueNoActiveLinks() {
final String linkName = "testLink";
final String address = "amq.direct/" + TOPIC_NAME;
Attach attach = createSharedTopicAttach(true, linkName, address, true);
_session.receiveAttach(attach);
assertAttachSent(_connection, _session, attach);
assertQueues(TOPIC_NAME, LifetimePolicy.PERMANENT);
sendDetach(_session, attach.getHandle(), false);
ArgumentCaptor<FrameBody> frameCapture = ArgumentCaptor.forClass(FrameBody.class);
verify(_connection, times(2)).sendFrame(eq(_session.getChannelId()), frameCapture.capture());
assertTrue(frameCapture.getAllValues().get(1) instanceof Detach);
assertQueues(TOPIC_NAME, LifetimePolicy.PERMANENT);
String topicName2 = TOPIC_NAME + "2";
final String address2 = "amq.direct/" + topicName2;
Attach attach2 = createSharedTopicAttach(true, linkName, address2, true);
_session.receiveAttach(attach2);
assertAttachSent(_connection, _session, attach2, 2);
assertQueues(topicName2, LifetimePolicy.PERMANENT);
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Detach in project qpid-broker-j by apache.
the class SendingLinkEndpoint method detach.
@Override
protected void detach(Error error, final boolean close) {
if (_consumerTarget != null) {
_consumerTarget.close();
}
Source source = getSource();
TerminusExpiryPolicy expiryPolicy = source.getExpiryPolicy();
NamedAddressSpace addressSpace = getSession().getConnection().getAddressSpace();
List<Symbol> sourceCapabilities = source.getCapabilities() == null ? Collections.emptyList() : Arrays.asList(source.getCapabilities());
if (close || TerminusExpiryPolicy.LINK_DETACH.equals(expiryPolicy) || ((expiryPolicy == null || TerminusExpiryPolicy.SESSION_END.equals(expiryPolicy)) && getSession().isClosing()) || (TerminusExpiryPolicy.CONNECTION_CLOSE.equals(expiryPolicy) && getSession().getConnection().isClosing())) {
Error closingError = null;
if (getDestination() instanceof ExchangeSendingDestination && addressSpace instanceof QueueManagingVirtualHost) {
cleanUpUnsettledDeliveries();
try {
((QueueManagingVirtualHost) addressSpace).removeSubscriptionQueue(((ExchangeSendingDestination) getDestination()).getQueue().getName());
TerminusDurability sourceDurability = source.getDurable();
if (sourceDurability != null && !TerminusDurability.NONE.equals(sourceDurability) && sourceCapabilities.contains(Session_1_0.SHARED_CAPABILITY) && sourceCapabilities.contains(ExchangeSendingDestination.TOPIC_CAPABILITY)) {
Pattern containerIdPattern = sourceCapabilities.contains(Session_1_0.GLOBAL_CAPABILITY) ? ANY_CONTAINER_ID : Pattern.compile("^" + Pattern.quote(getSession().getConnection().getRemoteContainerId()) + "$");
Pattern linkNamePattern = Pattern.compile("^" + Pattern.quote(getLinkName()) + "\\|?\\d*$");
final Collection<LinkModel> links = addressSpace.findSendingLinks(containerIdPattern, linkNamePattern);
for (LinkModel link : links) {
if (link instanceof Link_1_0) {
((Link_1_0) link).linkClosed();
}
}
}
} catch (AccessControlException e) {
LOGGER.error("Error unregistering subscription", e);
closingError = new Error(AmqpError.NOT_ALLOWED, "Error unregistering subscription");
} catch (IllegalStateException e) {
String message;
if (sourceCapabilities.contains(Session_1_0.SHARED_CAPABILITY) && sourceCapabilities.contains(ExchangeSendingDestination.TOPIC_CAPABILITY)) {
String subscriptionName = getLinkName();
int separator = subscriptionName.indexOf("|");
if (separator > 0) {
subscriptionName = subscriptionName.substring(0, separator);
}
message = "There are active consumers on the shared subscription '" + subscriptionName + "'";
} else {
message = e.getMessage();
}
closingError = new Error(AmqpError.RESOURCE_LOCKED, message);
} catch (NotFoundException e) {
closingError = new Error(AmqpError.NOT_FOUND, e.getMessage());
}
}
if (error == null) {
error = closingError;
} else {
LOGGER.warn("Unexpected error on detaching endpoint {}: {}", getLinkName(), error);
}
} else if (addressSpace instanceof QueueManagingVirtualHost && ((QueueManagingVirtualHost) addressSpace).isDiscardGlobalSharedSubscriptionLinksOnDetach() && sourceCapabilities.contains(Session_1_0.SHARED_CAPABILITY) && sourceCapabilities.contains(Session_1_0.GLOBAL_CAPABILITY) && sourceCapabilities.contains(ExchangeSendingDestination.TOPIC_CAPABILITY)) {
// However, we keep one link (ending with "|global") to perform a null-source lookup upon un-subscription.
if (!getLinkName().endsWith("|global")) {
getLink().linkClosed();
} else {
Pattern linkNamePattern = Pattern.compile("^" + Pattern.quote(getLinkName()) + "$");
final Collection<LinkModel> links = addressSpace.findSendingLinks(ANY_CONTAINER_ID, linkNamePattern);
if (links.size() > 1) {
getLink().linkClosed();
}
}
}
super.detach(error, close);
}
Aggregations