2016-06-17 2 views
2

Использование узла js Я хочу создать постоянную подписку на тему обслуживания сервисной шины Azure. сейчас он выполняется только один раз. Пожалуйста, назовите меня, я новичок в этом. Заранее спасибо. Я использую следующий код для подписки на тему.Azure + Node Js Service bus Постоянная подписка на тему

var azure = require('azure'); 

var azureConnection = "Endpoint=sb:My connection string" 

var retryOperations = new azure.ExponentialRetryPolicyFilter(); 
var serviceBusService = azure.createServiceBusService(azureConnection).withFilter(retryOperations); 

serviceBusService.receiveSubscriptionMessage('mytopic01', 'mytopicsub', function (error, receivedMessage) { 

    if (!error) { 
     // // // Message received and deleted 
     console.log(receivedMessage); 
    } 
}); 

Также я не хочу использовать функцию setInterval. Я хочу, чтобы решение, если сообщение опубликовано в теме, должно автоматически запускать подписку.

+0

receiveSubscriptionMessage - метод приема методов из подписки на уровне клиентского уровня. Внутри он опроса подписки. Опция push на стороне сервера отсутствует. – Aravind

+0

Я знаю, что это метод клиентской стороны. но мы должны вручную вызвать этот метод, чтобы получить данные, которые публикуются сервером. Мне не нужен ручной вызов, он должен автоматически вызываться, как только данные публикуются сервером (т. Е. Данные должны быть автоматически получены после публикации данных сервера для подписки на тему.) –

+0

он должен быть выполнен хотя бы один раз. в любом случае узел является серверной стороной js. он работает как метод обратного вызова. Я лично этого не делал. – Aravind

ответ

1

На самом деле, если ваше клиентское приложение является независимым приложением node.js, мы обычно настраиваем программу цикла для приема сообщения из служебной шины в цикле. E.G.

var azure = require('azure'); 
var sbService = azure.createServiceBusService(<connection_string>); 
function checkForMessages(sbService, queueName, callback) { 
    sbService.receiveSubscriptionMessage(queueName, { isPeekLock: true }, function (err, lockedMessage) { 
    if (err) { 
     if (err === 'No messages to receive') { 
     console.log('No messages'); 
     } else { 
     callback(err); 
     } 
    } else { 
     callback(null, lockedMessage); 
    } 
    }); 
} 
function processMessage(sbService, err, lockedMsg) { 
    if (err) { 
    console.log('Error on Rx: ', err); 
    } else { 
    console.log('Rx: ', lockedMsg); 
    sbService.deleteMessage(lockedMsg, function(err2) { 
     if (err2) { 
     console.log('Failed to delete message: ', err2); 
     } else { 
     console.log('Deleted message.'); 
     } 
    }) 
    } 
} 
setInterval(checkForMessages.bind(null, sbService, queueName, processMessage.bind(null, sbService)), 5000); 

Вы можете обратиться к образцу кода в аналогичном сценарии в GitHub предоставленной Azure Team.

Любая дополнительная забота, пожалуйста, сообщите мне.

+0

здесь вы использовали setInterval функция. Я не хочу это использовать. Это замедлит мое приложение. Я отправляю более 100 запросов в секунду для публикации. И хотите подписаться на одно и то же время в реальном времени. Использование setInterval не сможет справиться с этим. –

+0

Azure SDK в Node.js реализует API-интерфейс Rest через HTTP-протокол, поэтому в настоящее время нам нужно установить функциюInterval. И вы можете обратиться к http://stackoverflow.com/questions/34111382/max-throughput-for-azure-service-bus-queue-with-node-js-library/34127328#34127328 для принимающей производительности, о которой мы говорили ранее , –

+0

OK спасибо Гэри ... –