/** {@inheritDoc} */ @Override public boolean isMessageAcceptedBySelector(AndesMessageMetadata messageMetadata) throws AndesException { AMQMessage amqMessage = AMQPUtils.getAMQMessageFromAndesMetaData(messageMetadata); QueueEntry message = AMQPUtils.convertAMQMessageToQueueEntry(amqMessage, amqQueue); if (amqpSubscription.hasInterest(message)) { storedMessageCache.put( message.getMessage().getMessageNumber(), amqMessage.getStoredMessage()); return true; } else { return false; } }
/** * write message to channel * * @param queueEntry message to send * @throws AndesException */ private void sendMessage(QueueEntry queueEntry) throws AndesException { String msgHeaderStringID = (String) queueEntry.getMessageHeader().getHeader("msgID"); Long messageID = queueEntry.getMessage().getMessageNumber(); try { if (amqpSubscription instanceof SubscriptionImpl.AckSubscription) { MessageTracer.trace( messageID, "", "Sending message " + msgHeaderStringID + " messageID-" + messageID + "-to channel " + getChannelID()); amqpSubscription.send(queueEntry); } else if (amqpSubscription instanceof SubscriptionImpl.NoAckSubscription) { MessageTracer.trace( messageID, "", "Sending message " + msgHeaderStringID + " messageID-" + messageID + "-to channel " + getChannelID()); amqpSubscription.send(queueEntry); // After sending message we simulate acknowledgment for NoAckSubscription UUID channelID = ((SubscriptionImpl.NoAckSubscription) amqpSubscription).getChannel().getId(); AndesAckData andesAckData = AndesUtils.generateAndesAckMessage(channelID, messageID); Andes.getInstance().ackReceived(andesAckData); } else { throw new AndesException( "Error occurred while delivering message. Unexpected Subscription type for " + "message with ID : " + msgHeaderStringID); } } catch (AMQException e) { // The error is not logged here since this will be caught safely higher up in the execution // plan : // MessageFlusher.deliverAsynchronously. If we have more context, its better to log here too, // but since this is a general explanation of many possible errors, no point in logging at // this state. ProtocolMessage protocolMessage = ((AMQMessage) queueEntry.getMessage()).getAndesMetadataReference(); log.error( "AMQP Protocol Error while delivering message to the subscriber subID= " + amqpSubscription.getSubscriptionID() + " message id= " + messageID + " slot= " + protocolMessage.getMessage().getSlot().getId(), e); throw new ProtocolDeliveryFailureException( "Error occurred while delivering message with ID : " + msgHeaderStringID, e); } }