[英]Writing a unit test case in node.js using mocha to mock a azure service bus queue to recive messages
[英]Azure Node.js Running Service Bus Queue Messages in Worker Role
如何設置輔助角色以使用Windows Azure sdk偵聽服務器總線隊列消息?
目前,我在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");
});
而這在我的Web角色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'
}
});
}
});
};
如何獲取它,以便當Web角色運行index.js文件時,輔助角色可以偵聽並執行?
當前它沒有這樣做,消息正坐在隊列中,但是工作角色沒有讀取消息嗎?
如何獲得輔助角色以從隊列中讀取消息?
我應該運行cron作業還是使用socket.io? 我有點困惑。
您只需要使用.receiveQueueMessage方法連續輪詢隊列,直到從隊列接收消息即可。 兩次輪詢之間的時間間隔完全取決於您。
npm azure軟件包存在問題,該軟件包可通過下面的HTTP起作用,並且您知道HTTP是請求/響應協議。 (不幸的是,在此應用程序層中沒有諸如SignalR之類的東西或類似的其他“推送”類型的通信)。 因此,唯一的方法是提取消息-((。
但是,如果您使用AMQP協議,則還有另一種消費(監聽)消息的方法。
有一個稱為amqp10 (基於承諾,符合AMQP 1.0的node.js客戶端)的npm軟件包,您可以在其中訂閱消息並開始偵聽,其概念類似於httpServer或expressjs。 在他們的npmjs軟件包主頁上,您可以找到文檔和示例。
簡而言之,它看起來像這樣:..
async function sample( {connectionString, topicSubscriptionPath} ){
const { Client, Policy } = require('amqp10');
const client = new Client(Policy.Utils.RenewOnSettle(1, 1, Policy.ServiceBusTopic));
const connection = await client.connect(connectionString);
const receiver = await connection.createReceiver(topicSubscriptionPath);
receiver.on('message', (message) => {
try {
// here is your brokered message, do whatever u need to do
receiver.accept(message); //if can be marked as processed, aka can be deleted from service bus
} catch (error) {
this.receiver.reject(message); //return back to service bus
}
});
}
sample(buildConnectionString(), 'subscriptionNameInYourTopic');
function buildConnectionString(){
//very specific format, keys you can find in your azure subscription
return `amqps://${sharedAccessKeyName}:${sharedAccessKey}@${queueEndpoint}`;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.