it.polimi.modaclouds.cpimlibrary.taskqueuemng.AmazonTaskQueue.java Source code

Java tutorial

Introduction

Here is the source code for it.polimi.modaclouds.cpimlibrary.taskqueuemng.AmazonTaskQueue.java

Source

/**
 * Copyright 2013 deib-polimi
 * Contact: deib-polimi <marco.miglierina@polimi.it>
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package it.polimi.modaclouds.cpimlibrary.taskqueuemng;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.amazonaws.services.sqs.AmazonSQSClient;
import com.amazonaws.services.sqs.model.CreateQueueRequest;
import com.amazonaws.services.sqs.model.DeleteMessageRequest;
import com.amazonaws.services.sqs.model.GetQueueUrlRequest;
import com.amazonaws.services.sqs.model.GetQueueUrlResult;
import com.amazonaws.services.sqs.model.Message;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import com.amazonaws.services.sqs.model.SendMessageRequest;

public class AmazonTaskQueue implements CloudTaskQueue {

    private String queueName = null;
    private AmazonSQSClient sqs = null;
    private Map<String, String> cloud_task_ids = new HashMap<String, String>();
    private Map<String, String> receipts = new HashMap<String, String>();

    public AmazonTaskQueue(String queueName, AmazonSQSClient sqs) {
        this.queueName = queueName;
        this.sqs = sqs;
        CreateQueueRequest cqr = new CreateQueueRequest(queueName);
        sqs.createQueue(cqr);

        //new InternalWorker(queueName,queueInfo).start();
    }

    @Override
    public void add(CloudTask t) throws CloudTaskQueueException {
        GetQueueUrlRequest getQueueUrlRequest = new GetQueueUrlRequest(queueName);
        GetQueueUrlResult getQueueUrlResult = sqs.getQueueUrl(getQueueUrlRequest);
        String queueUrl = getQueueUrlResult.getQueueUrl();
        String id = sqs.sendMessage(new SendMessageRequest(queueUrl, buildMessage(t))).getMessageId();
        cloud_task_ids.put(t.getTaskName(), id);
    }

    @Override
    public String getQueueName() {
        return this.queueName;
    }

    @Override
    public void purge() throws CloudTaskQueueException {
        String queueUrl = sqs.getQueueUrl(new GetQueueUrlRequest(queueName)).getQueueUrl();
        Set<String> keys = receipts.keySet();
        for (String key : keys) {
            sqs.deleteMessage(new DeleteMessageRequest(queueUrl, receipts.get(key)));
        }
        ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl);
        List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
        for (Message m : messages) {
            sqs.deleteMessage(new DeleteMessageRequest(queueUrl, m.getReceiptHandle()));
        }
        receipts.clear();
        cloud_task_ids.clear();
    }

    @Override
    public boolean delete(CloudTask t) {
        String queueUrl = sqs.getQueueUrl(new GetQueueUrlRequest(queueName)).getQueueUrl();
        String id = cloud_task_ids.get(t.getTaskName());
        if (receipts.get(id) != null) {
            sqs.deleteMessage(new DeleteMessageRequest(queueUrl, receipts.get(id)));
            receipts.remove(id);
            cloud_task_ids.remove(t.getTaskName());
            return true;
        }
        return false;
    }

    public boolean deleteMessage(AmazonTaskQueueMessage atqm) {
        String queueUrl = sqs.getQueueUrl(new GetQueueUrlRequest(queueName)).getQueueUrl();
        if (atqm.getPopReceipt() != null) {
            sqs.deleteMessage(new DeleteMessageRequest(queueUrl, atqm.getPopReceipt()));
            receipts.remove(atqm.getMessageId());
            return true;
        }
        return false;
    }

    private String buildMessage(CloudTask task) {
        String parameters = "";
        for (String key : task.getParameters().keySet()) {
            parameters = parameters + "<PARAMETER>" + "<KEY>" + key + "</KEY>" + "<VALUE>"
                    + task.getParameters().get(key) + "</VALUE>" + "</PARAMETER>";
        }
        //aggiunto il tag URL all'interno di MSG
        //String msg = "<URL>" + task.getHostUri()+":"+task.getPort()+task.getContextPath()+"</URL>";
        //msg += "<MSG><SERVLET>"+task.getServletUri() + "</SERVLET><METHOD>"
        //   + task.getMethod() + "</METHOD>" + parameters + "</MSG>";
        //String msg = "<MSG><URL>" + task.getHostUri() + "</URL>";
        String msg = "<MSG><SERVLET>" + task.getServletUri() + "</SERVLET><METHOD>" + task.getMethod() + "</METHOD>"
                + parameters + "</MSG>";
        return msg;
    }

    public AmazonTaskQueueMessage getMessage() {
        String text = null;
        String id = null;
        String pop = null;
        String queueUrl = sqs.getQueueUrl(new GetQueueUrlRequest(queueName)).getQueueUrl();
        ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl);
        List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
        if (messages.size() == 0)
            return null;
        for (Message m : messages) {
            text = m.getBody();
            id = m.getMessageId();
            pop = m.getReceiptHandle();
            receipts.put(id, pop);
            break;
        }
        return new AmazonTaskQueueMessage(id, text, pop);
    }

}