Example usage for com.amazonaws.services.sqs.model Message getReceiptHandle

List of usage examples for com.amazonaws.services.sqs.model Message getReceiptHandle

Introduction

In this page you can find the example usage for com.amazonaws.services.sqs.model Message getReceiptHandle.

Prototype


public String getReceiptHandle() 

Source Link

Document

An identifier associated with the act of receiving the message.

Usage

From source file:org.apache.usergrid.apm.service.MetricsInjestionServiceSQSImpl.java

License:Apache License

protected List<ReceiveMessageResult> getClientDataForApp(String fullAppName) {

    ArrayList<ReceiveMessageResult> messageResults = new ArrayList<ReceiveMessageResult>(
            MAX_NUMBER_OF_REQUEST_TO_PROCESS);

    try {//from   w  w w.ja  va 2s .  c  o m
        GetQueueAttributesRequest queueAttributesRequest = new GetQueueAttributesRequest();

        ArrayList<String> attributeNames = new ArrayList<String>(2);

        attributeNames.add("ApproximateNumberOfMessages");
        attributeNames.add("LastModifiedTimestamp");
        //attributeNames.add("All");

        queueAttributesRequest.setAttributeNames(attributeNames);
        String qUrl = AWSUtil.formFullQueueUrl(fullAppName);
        log.info("Getting APM data from SQS queue" + qUrl);
        queueAttributesRequest.setQueueUrl(qUrl);

        GetQueueAttributesResult queueAttributeResult = sqsClient.getQueueAttributes(queueAttributesRequest);

        String numMessagesString = queueAttributeResult.getAttributes().get("ApproximateNumberOfMessages");

        //Calculate number of "ReceiveMessage" requests need to be made.
        //TODO might need to use AsyncClient in the future to make multiple requests

        int numMessages = Integer.parseInt(numMessagesString);

        log.info("Num Messages to Process " + numMessages + " messages");

        if (numMessages > 0) {
            int receiveMessages = 0;
            int receiveRequest = 0;
            int lastNumberOfRecievedMessages = 1;

            while ((receiveMessages < numMessages) && (receiveRequest < MAX_NUMBER_OF_REQUEST_TO_PROCESS)
                    && (lastNumberOfRecievedMessages != 0)) {
                ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest();
                receiveMessageRequest.setMaxNumberOfMessages(MAX_NUMBER_OF_MESSAGES);
                receiveMessageRequest.setQueueUrl(qUrl);

                ArrayList<String> requestMessageAttributeNames = new ArrayList<String>(1);
                requestMessageAttributeNames.add("All");

                receiveMessageRequest.setAttributeNames(requestMessageAttributeNames);

                try {
                    ReceiveMessageResult receiveMessageResult = sqsClient.receiveMessage(receiveMessageRequest);
                    log.info("For application " + fullAppName + " Received "
                            + receiveMessageResult.getMessages().size() + " messages.");
                    receiveMessages += receiveMessageResult.getMessages().size();
                    //check if any of these messages have been downloaded already. Since SQS is distributed and injestor
                    //could have failed before deleting particular message, we check for message read count to 3. In odd
                    //case, some messages could get processed at most 3 times.
                    List<Message> messages = receiveMessageResult.getMessages();
                    String receiveCount = null;
                    Message m = null;
                    for (Iterator<Message> iter = messages.iterator(); iter.hasNext();) {
                        m = iter.next();
                        receiveCount = m.getAttributes().get("ApproximateReceiveCount");
                        if (receiveCount != null && Integer.valueOf(receiveCount) > 3) {
                            log.warn("ReceiveCount of message for app " + fullAppName
                                    + " is greater than 3 so going to delete this message before further processing");
                            sqsClient.deleteMessage(new DeleteMessageRequest(qUrl, m.getReceiptHandle()));
                            iter.remove();
                        }
                    }

                    lastNumberOfRecievedMessages = receiveMessageResult.getMessages().size();
                    if (lastNumberOfRecievedMessages > 0) {
                        messageResults.add(receiveMessageResult);
                        receiveRequest++;
                    }
                    ;
                } catch (Exception ex) {
                    log.error("Problem getting messages for " + fullAppName, ex);
                }
            }
        }
    } catch (AmazonServiceException ce) {
        log.error("Problem pulling message from SQS for " + fullAppName, ce);
    } catch (Exception e) {
        log.error("Problem getting messages for " + fullAppName, e);
    }

    return messageResults;
}

From source file:org.apache.usergrid.apm.service.MetricsInjestionServiceSQSImpl.java

License:Apache License

protected void deleteMessageResults(List<ReceiveMessageResult> messageResults, String orgAppName) {
    //TODO: Definately want this to use asynchronous client due the the potentially thousands of
    // messages that might get queued up.
    for (ReceiveMessageResult messageResult : messageResults) {

        for (Message message : messageResult.getMessages()) {
            DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest();
            deleteMessageRequest.setQueueUrl(AWSUtil.formFullQueueUrl(orgAppName));
            deleteMessageRequest.setReceiptHandle(message.getReceiptHandle());
            try {
                sqsClient.deleteMessage(deleteMessageRequest);
            } catch (RuntimeException ce) {
                log.error("Cannot delete message for application : " + orgAppName + ". Receipt Handle :"
                        + message.getReceiptHandle(), ce);
            } catch (Exception e) {
                log.error("error deleting ", e);
            }/*w w w.  j av a  2s.co m*/
        }
    }
}

From source file:org.apache.usergrid.apm.service.MetricsInjestionServiceSQSImpl.java

License:Apache License

protected void purgeSQSQueue(List<ReceiveMessageResult> receiveMessageResults, String orgAppName) {
    int numDeletedMessages = 0;
    try {/*from w  ww .java  2 s  .c  o  m*/

        String qUrl = AWSUtil.formFullQueueUrl(orgAppName);
        for (ReceiveMessageResult receiveMessageResult : receiveMessageResults) {
            for (Message message : receiveMessageResult.getMessages()) {
                String receiptHandle = message.getReceiptHandle();

                DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest();

                deleteMessageRequest.setQueueUrl(qUrl);
                deleteMessageRequest.setReceiptHandle(receiptHandle);

                sqsClient.deleteMessage(deleteMessageRequest);
                numDeletedMessages++;
            }
            log.info("Deleted " + numDeletedMessages + " messages for application : " + orgAppName);
        }

    } catch (Exception e) {
        log.error("Problem deleting message from SQS for " + orgAppName
                + ". This needs to be immediately looked into", e);
    }

}

From source file:org.apache.usergrid.persistence.queue.impl.SNSQueueManagerImpl.java

License:Apache License

@Override
public List<LegacyQueueMessage> getMessages(final int limit, final Class klass) {

    if (sqs == null) {
        logger.error("SQS is null - was not initialized properly");
        return new ArrayList<>(0);
    }//w w w. j av  a2 s  .c  o m

    String url = getReadQueue().getUrl();

    if (logger.isTraceEnabled()) {
        logger.trace("Getting up to {} messages from {}", limit, url);
    }

    ArrayList<String> requestMessageAttributeNames = new ArrayList<String>(1);
    requestMessageAttributeNames.add("ApproximateReceiveCount");

    ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(url);
    receiveMessageRequest.setAttributeNames(requestMessageAttributeNames);
    receiveMessageRequest.setMaxNumberOfMessages(limit);
    receiveMessageRequest
            .setVisibilityTimeout(Math.max(MIN_VISIBILITY_TIMEOUT, fig.getVisibilityTimeout() / 1000));

    int longPollTimeout = Math.min(20000, fig.getQueuePollTimeout()); // 20000 is the SQS maximum

    // ensure the client's socket timeout is not less than the configure long poll timeout
    if (fig.getQueueClientSocketTimeout() < longPollTimeout) {

        longPollTimeout = Math.max(0, fig.getQueueClientSocketTimeout() - 1000);

    }

    receiveMessageRequest.setWaitTimeSeconds(longPollTimeout / 1000); // convert to seconds

    try {
        ReceiveMessageResult result = sqs.receiveMessage(receiveMessageRequest);
        List<Message> messages = result.getMessages();

        if (logger.isTraceEnabled()) {
            logger.trace("Received {} messages from {}", messages.size(), url);
        }

        List<LegacyQueueMessage> queueMessages = new ArrayList<>(messages.size());

        for (Message message : messages) {

            Object payload;
            final String originalBody = message.getBody();

            try {
                final JsonNode bodyNode = mapper.readTree(message.getBody());

                /**
                 * When a message originates from SNS it has a "Message"  we have to extract
                 * it and then process it separately
                 */

                if (bodyNode.has("Message")) {
                    final String snsNode = bodyNode.get("Message").asText();

                    payload = deSerializeSQSMessage(snsNode, klass);
                } else {
                    payload = deSerializeSQSMessage(originalBody, klass);
                }
            } catch (Exception e) {
                logger.error("failed to deserialize message: {}", message.getBody(), e);
                throw new RuntimeException(e);
            }

            LegacyQueueMessage queueMessage = new LegacyQueueMessage(message.getMessageId(),
                    message.getReceiptHandle(), payload, message.getAttributes().get("type"));
            queueMessage.setStringBody(originalBody);
            int receiveCount = Integer.valueOf(message.getAttributes().get("ApproximateReceiveCount"));
            queueMessage.setReceiveCount(receiveCount);
            queueMessages.add(queueMessage);
        }

        return queueMessages;
    } catch (com.amazonaws.services.sqs.model.QueueDoesNotExistException dne) {
        logger.error("Queue does not exist! [{}]", url, dne);
    } catch (Exception e) {
        logger.error("Programming error getting messages from queue=[{}] exist!", url, e);
    }

    return new ArrayList<>(0);
}

From source file:org.duracloud.common.queue.aws.SQSTaskQueue.java

License:Apache License

protected Task marshallTask(Message msg) {
    Properties props = new Properties();
    Task task = null;/* w w  w .  j a v a  2s. com*/
    try {
        props.load(new StringReader(msg.getBody()));

        if (props.containsKey(Task.KEY_TYPE)) {
            task = new Task();
            for (final String key : props.stringPropertyNames()) {
                if (key.equals(Task.KEY_TYPE)) {
                    task.setType(Task.Type.valueOf(props.getProperty(key)));
                } else {
                    task.addProperty(key, props.getProperty(key));
                }
            }
            task.addProperty(MsgProp.MSG_ID.name(), msg.getMessageId());
            task.addProperty(MsgProp.RECEIPT_HANDLE.name(), msg.getReceiptHandle());
        } else {
            log.error("SQS message from queue: " + queueName + ", queueUrl: " + queueUrl
                    + " does not contain a 'task type'");
        }
    } catch (IOException ioe) {
        log.error("Error creating Task", ioe);
    }
    return task;
}

From source file:org.duracloud.common.sns.SnsSubscriptionManager.java

License:Apache License

private void startPolling() {
    new Thread(new Runnable() {
        @Override//from   w  w w  . ja  va 2 s . c  o  m
        public void run() {
            while (initialized) {
                try {
                    ReceiveMessageResult result = sqsClient.receiveMessage(queueUrl);
                    List<Message> messages = result.getMessages();
                    for (Message message : messages) {
                        dispatch(message);
                        log.debug("{} dispatched", message);
                        sqsClient.deleteMessage(queueUrl, message.getReceiptHandle());
                        log.debug("{} deleted", message);
                    }

                } catch (Exception ex) {
                    log.warn("failed to poll queue: " + ex.getMessage(), ex);
                }
            }
        }

    }, "sqs-long-poller").start();
}

From source file:org.flite.mock.amazonaws.sqs.AmazonSQSMock.java

License:Open Source License

public ReceiveMessageResult receiveMessage(final ReceiveMessageRequest request)
        throws AmazonServiceException, AmazonClientException {
    if (request == null) {
        throw new AmazonClientException("Null ReceiveMessageRequest");
    }//from  w w  w . j ava 2s  .  c o m
    final String queueUrl = request.getQueueUrl();
    checkURLForException(queueUrl);
    // Per documentation throws OverLimitException, but in my testing,
    // they actually only throw AmazonServiceException
    final Integer max = request.getMaxNumberOfMessages();
    if (max == null || max < 1 || max > 10) {
        throw new AmazonServiceException("MaxNumberOfMessages must be a value between [1,10]");
    }
    final ReceiveMessageResult result = new ReceiveMessageResult();
    int received = 0;
    boolean avail = true;
    while (received < request.getMaxNumberOfMessages() && avail) {
        try {
            final Message msg = allQueues.get(queueUrl).remove(0);
            received++;
            msg.setReceiptHandle(RECEIPT_ID_PREFIX + incrementer.getAndIncrement());
            retrievedMessages.get(queueUrl).put(msg.getReceiptHandle(), msg);
            result.withMessages(msg);
        } catch (Exception ex) {
            avail = false;
        }
    }
    return result;
}

From source file:org.hashbang.util.AutoDiscoverQueue.java

License:Open Source License

public static String getInfo() {

    Message message = null;
    String msg = null;/*from  w w w  . j  a  v  a  2 s .com*/

    try {
        // Receive messages
        AmazonSQS sqs = init();
        ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(QUEUE_URL);
        sqs.receiveMessage(receiveMessageRequest);
        message = sqs.receiveMessage(receiveMessageRequest).getMessages().get(0);

        msg = message.getBody();
        sqs.deleteMessage(new DeleteMessageRequest(QUEUE_URL, message.getReceiptHandle()));

    } catch (AmazonServiceException ase) {
        System.out.println("Caught an AmazonServiceException, which means your request made it "
                + "to Amazon SQS, but was rejected with an error response for some reason.");
        System.out.println("Error Message:    " + ase.getMessage());
        System.out.println("HTTP Status Code: " + ase.getStatusCode());
        System.out.println("AWS Error Code:   " + ase.getErrorCode());
        System.out.println("Error Type:       " + ase.getErrorType());
        System.out.println("Request ID:       " + ase.getRequestId());
    } catch (AmazonClientException ace) {
        System.out.println("Caught an AmazonClientException, which means the client encountered "
                + "a serious internal problem while trying to communicate with SQS, such as not "
                + "being able to access the network.");
        System.out.println("Error Message: " + ace.getMessage());
    } finally {
        return msg;
    }
}

From source file:org.juneja.eventdemo.utils.AmazonSimpleQueueService.java

License:Open Source License

public static void main(String[] args) throws Exception {

    /*//w w  w  . j ava 2s  . c  o m
     * The ProfileCredentialsProvider will return your [default]
     * credential profile by reading from the credentials file located at
     * (~/.aws/credentials).
     */
    AWSCredentials credentials = null;
    try {
        credentials = new ProfileCredentialsProvider().getCredentials();
    } catch (Exception e) {
        throw new AmazonClientException("Cannot load the credentials from the credential profiles file. "
                + "Please make sure that your credentials file is at the correct "
                + "location (~/.aws/credentials), and is in valid format.", e);
    }

    AmazonSQS sqs = new AmazonSQSClient(credentials);
    Region usWest2 = Region.getRegion(Regions.DEFAULT_REGION);
    sqs.setRegion(usWest2);

    System.out.println("===========================================");
    System.out.println("Getting Started with Amazon SQS");
    System.out.println("===========================================\n");

    try {
        // Create a queue
        // System.out.println("Creating a new SQS queue called MyQueue.\n");
        // CreateQueueRequest createQueueRequest = new CreateQueueRequest("TestQueue_EventDriven_2");
        // String myQueueUrl = sqs.createQueue(createQueueRequest).getQueueUrl();

        GetQueueUrlResult queueResult = sqs.getQueueUrl("TestQueue_EventDriven_2");
        String myQueueUrl = queueResult.getQueueUrl();

        // List queues
        System.out.println("Listing all queues in your account.\n");
        for (String queueUrl : sqs.listQueues().getQueueUrls()) {
            System.out.println("  QueueUrl: " + queueUrl);
        }
        System.out.println();

        // Send a message
        //System.out.println("Sending a message to MyQueue.\n");
        //sqs.sendMessage(new SendMessageRequest(myQueueUrl, "This is my new text."));

        // Receive messages
        System.out.println("Receiving messages from MyQueue.\n");
        ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl);
        List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();

        System.out.println("Number of messages : " + messages.size());

        for (Message message : messages) {
            System.out.println("  Message");
            System.out.println("    MessageId:     " + message.getMessageId());
            System.out.println("    ReceiptHandle: " + message.getReceiptHandle());
            System.out.println("    MD5OfBody:     " + message.getMD5OfBody());
            System.out.println("    Body:          " + message.getBody());
            for (Entry<String, String> entry : message.getAttributes().entrySet()) {
                System.out.println("  Attribute");
                System.out.println("    Name:  " + entry.getKey());
                System.out.println("    Value: " + entry.getValue());
            }
        }
        System.out.println();

        // Delete a message
        //System.out.println("Deleting a message.\n");
        //String messageRecieptHandle = messages.get(0).getReceiptHandle();
        //sqs.deleteMessage(new DeleteMessageRequest(myQueueUrl, messageRecieptHandle));

        // Delete a queue
        /**
        System.out.println("Deleting the test queue.\n");
        sqs.deleteQueue(new DeleteQueueRequest(myQueueUrl));
        **/
    } catch (AmazonServiceException ase) {
        System.out.println("Caught an AmazonServiceException, which means your request made it "
                + "to Amazon SQS, but was rejected with an error response for some reason.");
        System.out.println("Error Message:    " + ase.getMessage());
        System.out.println("HTTP Status Code: " + ase.getStatusCode());
        System.out.println("AWS Error Code:   " + ase.getErrorCode());
        System.out.println("Error Type:       " + ase.getErrorType());
        System.out.println("Request ID:       " + ase.getRequestId());
    } catch (AmazonClientException ace) {
        System.out.println("Caught an AmazonClientException, which means the client encountered "
                + "a serious internal problem while trying to communicate with SQS, such as not "
                + "being able to access the network.");
        System.out.println("Error Message: " + ace.getMessage());
    }
}

From source file:org.lendingclub.reflex.aws.sqs.SQSAdapter.java

License:Apache License

public void delete(Message m) {
    String url = getQueueUrl();/*from   w w  w. j  a  va 2  s . c o  m*/
    logger.info("deleting {} {}", url, m.getReceiptHandle());
    DeleteMessageRequest dmr = new DeleteMessageRequest(url, m.getReceiptHandle());
    sqs.deleteMessage(dmr);
}