-1

I've created a storage queue, inserted a message to the queue. I keep reading the message with a webjob written in node, I can see the dequeue count is increasing. However, its never been put to the poison queue.

Is this taken care by azure or something I have to write in my nodeja webjob?

Create the queue in C#

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString);
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
CloudQueue queue = queueClient.GetQueueReference("successemailqueue");
queue.CreateIfNotExists();

var messageData = JsonConvert.SerializeObject(data, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
queue.AddMessage(new CloudQueueMessage(messageData));

Read messages from the queue:

var retryOperations = new azure.ExponentialRetryPolicyFilter();
var queueService = azure.createQueueService(config.storageName, config.storageKey)
                        .withFilter(retryOperations);
var singleMessageDefaults = { numofmessages: 1, visibilitytimeout: 2 * 60 };

var getSingleMessage = function() {
    var deferred = Q.defer();
    queueService.getMessages(config.queueName, singleMessageDefaults,
                             getSingleMessageComplete(deferred));
    return deferred.promise;
};

Process message:

var processMessage = function(message){
    if (message) {
        if (message.dequeuecount < 5) {
            sendEmail(message, queue.deleteMessage);
        }else{
            // move to poison queue
        }
    }
};

Thanks

vbn
  • 789
  • 1
  • 6
  • 16

2 Answers2

1

Because you have used this example you can add a method into queue.js file for inserting new messages into the queue and moving into the poison queue maybe implemented like so:

Inserting new messages (queue.js):

function addMessage(queueName, message){
    var deferred = Q.defer();
    queueService.createMessage(queueName, message,
        function (error, result, response) {
            if (error) {
                deferred.reject({ error: error, result: result, response: response });
            } else {
                deferred.resolve(result);
            }
        });

    return deferred.promise;
}

Moving to poison (run.js):

var processMessage = function(message){
    var deferred = Q.defer();
        if (message) {
            if (message.dequeuecount < 5) {
                sendEmail(message, queue.deleteMessage);
            } else {
                moveToPoison(message);
            };
    }
}

function moveToPoison(message){
    var deferred = Q.defer();

    var poisonQueueConf = {
        storageName: config.storageName, 
        storageKey: config.storageKey,
        queueName: config.queueName + '-poison'
    };

    var poisonQueue = require("./queue")(poisonQueueConf);

    queue.deleteMessage(message)
        .then(function(){
            return poisonQueue.addMessage(.messagetext)
                .then(function () {
                    deferred.resolve();
                }); 
        }).catch(function(error){
            deferred.reject(error);
        });

    return deferred.promise;        
}
Lord_27
  • 26
  • 1
  • 3
  • Hi, this is exactly what i was thinking. Initially, I thought Azure can automatically move the message because when I tried it in C#, I didn't have to do that. But it turns out the webjobs SDK was doing that for me! – vbn Sep 27 '15 at 23:58
0

I tried to reproduct your issue successfully. When read messages from the queue and do not delete it, the dequeuecount property will be increasing.

So the solution for your issue is that delete the message from the queue storage in time after readed message. Please refer to https://azure.microsoft.com/en-us/documentation/articles/storage-nodejs-how-to-use-queues/#how-to-dequeue-the-next-message.

This is my sample code below by modifying your code:

var azure = require('azure');
var config = {storageName: "<storage_name>", storageKey: "<storage_key>", queueName: "<queue_name>"};
var retryOperations = new azure.ExponentialRetryPolicyFilter();
var queueService = azure.createQueueService(config.storageName, config.storageKey)
                        .withFilter(retryOperations);
var singleMessageDefaults = { numofmessages: 1, visibilitytimeout: 2 * 60 };
var getSingleMessage = function() {
    var message;
    queueService.getMessages(config.queueName, singleMessageDefaults, function(error, result, response) {
        if(!error) {
            message = result[0];
            if(message != undefined) {
                queueService.deleteMessage(config.queueName, message.messageid, message.popreceipt, function(error, response){
                    if(!error){
                            console.log('message deleted from queue');
                    }
                });
            }
        }
    });
    return message;
};

Best Regards.

Peter Pan
  • 23,476
  • 4
  • 25
  • 43
  • Hi Pete, sorry for the confusion. My question is rather how to move the message to poison queue once it has reached the dequeue count threshold. Initially, I thought this could be done in configs when creating the queue, but after googling a while, i realized that this has to be done by the client. – vbn Sep 27 '15 at 23:55