/** * Verifies that the endpoint opens a receiver under normal circumstances. */ @Test public void testOnLinkAttachOpensReceiver() { final RequestResponseEndpoint<ServiceConfigProperties> endpoint = getEndpoint(true); when(receiver.getRemoteQoS()).thenReturn(ProtonQoS.AT_LEAST_ONCE); endpoint.onLinkAttach(connection, receiver, resource); verify(receiver).handler(any(ProtonMessageHandler.class)); verify(receiver).open(); verify(receiver, never()).close(); }
/** * Verifies that the endpoint closes a receiver that wants to use <em>at-most-once</em> * delivery semantics. */ @Test public void testOnLinkAttachClosesReceiverUsingAtMostOnceQoS() { final RequestResponseEndpoint<ServiceConfigProperties> endpoint = getEndpoint(true); when(receiver.getRemoteQoS()).thenReturn(ProtonQoS.AT_MOST_ONCE); endpoint.onLinkAttach(connection, receiver, resource); verify(receiver).close(); }
if (ProtonQoS.AT_MOST_ONCE.equals(receiver.getRemoteQoS())) { logger.debug("client wants to use unsupported AT MOST ONCE delivery mode for endpoint [{}], closing link ...", getName()); receiver.setCondition(ProtonHelper.condition(AmqpError.PRECONDITION_FAILED.toString(), "endpoint requires AT_LEAST_ONCE QoS"));
if (ProtonQoS.AT_MOST_ONCE.equals(receiver.getRemoteQoS())) { logger.debug("client wants to use unsupported AT MOST ONCE delivery mode for endpoint [{}], closing link ...", getName()); receiver.setCondition(ProtonHelper.condition(AmqpError.PRECONDITION_FAILED.toString(), "endpoint requires AT_LEAST_ONCE QoS"));
@Override public void onLinkAttach(final ProtonReceiver receiver, final ResourceIdentifier targetAddress) { if (ProtonQoS.AT_MOST_ONCE.equals(receiver.getRemoteQoS())) { logger.debug("client wants to use AT MOST ONCE delivery mode for registration endpoint, this is not supported."); receiver.setCondition(condition(AmqpError.PRECONDITION_FAILED.toString(), "endpoint requires AT_LEAST_ONCE QoS")); receiver.close(); } else { logger.debug("establishing link for receiving registration messages from client [{}]", MessageHelper.getLinkName(receiver)); receiver .setQoS(ProtonQoS.AT_LEAST_ONCE) .setAutoAccept(true) // settle received messages if the handler succeeds .setPrefetch(20) .handler((delivery, message) -> { if (RegistrationMessageFilter.verify(targetAddress, message)) { try { processRequest(message); } catch (DecodeException e) { MessageHelper.rejected(delivery, AmqpError.DECODE_ERROR.toString(), "malformed payload"); } } else { MessageHelper.rejected(delivery, AmqpError.DECODE_ERROR.toString(), "malformed registration message"); // we close the link if the client sends a message that does not comply with the API spec onLinkDetach(receiver, condition(AmqpError.DECODE_ERROR.toString(), "invalid message received")); } }).closeHandler(clientDetached -> onLinkDetach(clientDetached.result())) .open(); } }
}); if (receiver.getRemoteQoS() == ProtonQoS.AT_MOST_ONCE) {
if (ProtonQoS.AT_MOST_ONCE.equals(receiver.getRemoteQoS())) { receiver.setQoS(receiver.getRemoteQoS()); receiver.setPrefetch(30);