Example #1
0
  /** {@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;
    }
  }
Example #2
0
  /**
   * 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);
    }
  }