2012-07-30 4 views
1

Как настроить роль рабочего для прослушивания сообщений очереди шины сервера с помощью окна azure sdk?Azure Node.js Запуск сообщений очереди служебной шины в роли рабочего

В настоящее время у меня есть это в моей server.js роли работника для прослушивания сообщений очереди

var http = require('http') 
    , config = require('./config') 
    , azure = require('azure') 
    , uuid = require('node-uuid'); 

http.createServer(function (req, res) { 
    processServices(function() { 
     res.writeHead(200, { 'Content-Type': 'text/plain' }); 
     res.end('hello world'); 
    }); 
}).listen(process.env.port); 

function processServices(callback) { 
    var sb1 = azure.createServiceBusService(config.serviceBusNamespace, config.serviceBusAccessKey); 
    sb1.receiveQueueMessage('startup', function (error, m) { 
     if (!error) { 
      writeMessage(JSON.stringify(m), function() { 
       callback(); 
      }); 
     } 
     else { 
      writeMessage(JSON.stringify(error), function() { 
       callback(); 
      }); 
     } 
    }); 
} 

function writeMessage(message, callback) { 
    var serviceClient = azure.ServiceClient; 
    var ts1 = azure.createTableService(serviceClient.DEVSTORE_STORAGE_ACCOUNT, serviceClient.DEVSTORE_STORAGE_ACCESS_KEY, serviceClient.DEVSTORE_TABLE_HOST); 

    ts1.getTable('Messages', function (error) { 
     if (error === null) { 
      var messageEntity = { 
       PartitionKey: '0', 
       RowKey: uuid(), 
       Message: message 
      }; 

      ts1.insertEntity('Messages', messageEntity, function (error, newMessage) { 
       callback(); 
      }); 
     } 
     else callback(); 
    }); 
} 

И это в моем server.js веб-роли для настройки очереди

var sb1 = azure.createServiceBusService(config.serviceBusNamespace, config.serviceBusAccessKey); 
sb1.getQueue('startup', function (error, queue) { 
    if (error) { 
     sb1.createQueueIfNotExists('startup', function (error, queue) { 
      if (!error) 
       console.log("created startup queue 1: " + JSON.stringify(queue) + "\n"); 
      else 
       console.log("don't got startup queue 1: " + JSON.stringify(error) + "\n"); 
     }); 
    } 
    else console.log("created startup queue 2: " + JSON.stringify(queue) + "\n"); 
}); 
sb1.getQueue('serialnumbers', function (error, queue) { 
    if (error) { 
     sb1.createQueueIfNotExists('serialnumbers', function (error, queue) { 
      if (!error) 
       console.log("created serialnumbers queue 1: " + JSON.stringify(queue) + "\n"); 
      else 
       console.log("don't got serialnumbers queue 1: " + JSON.stringify(error) + "\n"); 
     }); 
    } 
    else console.log("created serialnumbers queue 2: " + JSON.stringify(queue) + "\n"); 
}); 

И в этом мой веб-роль index.js файла, чтобы отправить сообщение в очередь

var azure = require('azure') 
    , config = require('../utils/config'); 

exports.index = function (req, res) { 
    var sb1 = azure.createServiceBusService(config.serviceBusNamespace, config.serviceBusAccessKey); 
    var startupMessage = { 
     body: '' 
    }; 

    sb1.getQueue('startup', function (error, queue) { 
     if (!error) { 
      sb1.sendQueueMessage('startup', startupMessage, function (error) { 
       if (!error) { 
        console.log("sent startup message 1\n"); 

        res.render('index', { 
         locals: { 
          pageTitle: 'Home' 
         } 
        }); 
       } 
       else { 
        console.log("didn't send startup message 1: " + JSON.stringify(error) + "\n"); 

        res.render('index', { 
         locals: { 
          pageTitle: 'Home' 
         } 
        }); 
       } 
      }); 
     } 
     else { 
      res.render('index', { 
       locals: { 
        pageTitle: 'Home' 
       } 
      }); 
     } 
    }); 
}; 

Как я могу получить его так, что й Рабочая роль пользователя прослушивается и выполняется, когда веб-роль запускает файл index.js?

В настоящее время его не делают, сообщения сидят в очереди, но не читаются рабочей ролью?

Как получить рабочую роль для чтения сообщения из очереди?

Должен ли я запускать задание cron или использовать socket.io? Я немного запутался.

ответ

0

Вам просто нужно постоянно посещать очередь с помощью метода .receiveQueueMessage, пока вы не получите сообщение из очереди. Временные интервалы между опросами полностью дополняют вас.

+0

hi bbbonthemoon, в соответствии с кодом, который я написал, вы можете дать мне пример того, что вы имеете в виду? cheers –

+1

хорошо, дело в том, что клиент очереди Bus Bus Service, не дожидаясь получения сообщения, когда вы проводите опрос с помощью receiveQueueMessage(), он просто проверяет, есть ли сообщение для вас, если да, он его получает, он ничего не получает и уходит. Поэтому вам нужно вызвать этот метод снова и снова, пока не будет получено сообщение. Создание бесконечного цикла в асинхронной среде - это отдельная тема, я обычно делаю это с помощью событий. Я проверяю очередь на пользовательское событие и запускаю событие, когда я снова готов к опросу. – bbbonthemoon

+0

ok bbbonthemoon спасибо, я подумал, что лучше всего подходит для этого с node.js - это модуль cron, поэтому я буду использовать его. cheers –

Смежные вопросы