我正在使用azure-sdk-for-node包在Azure Worker Role中运行一个简单的Node.js应用。
var azure = require('azure'),
http = require('http'),
winston = require('winston'),
logger = new (winston.Logger)({
transports: [ new (winston.transports.File)({ filename: 'C:\\log.txt' }) ]
}),
http.createServer(function (req, res) {
res.writeHead(200);
res.end('Hello, World!');
}).listen(process.env.port || 1337);
azure.RoleEnvironment.on('changing', function (changes) {
winston.info('changing', changes);
// Got configuration changes here
// {
// "changes": [
// {
// "type": "ConfigurationSettingChange",
// "name": "MyApp.Settings1"
// },
// {
// "type": "ConfigurationSettingChange",
// "name": "Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountExpiration"
// }
// ]
// }
});
azure.RoleEnvironment.on('changed', function () {
// Also got this event
winston.info('changing');
});
azure.RoleEnvironment.on('stopping', function () {
// Never fired
winston.info('stopping');
});
应用程序在工作者角色上正常运行,没有问题,直到我通过管理门户修改配置。
我通过管理门户更新了配置,然后点击了保存。不久之后,我在应用上获得了changing
和changed
个事件。但是在收到这些事件后6分钟,整个工作者角色在没有任何stopping
事件的情况下重新启动。我使用包winston登录到C:\,日志通过重启保持不变。
日志显示如下:
00:00 setup_worker.cmd
00:01 server.js with PID 1
00:06 "role changing"
00:06 "role changed"
00:12 setup_worker.cmd
00:13 server.js with PID 2
(注意:setup_worker.cmd是CSDEF中的启动脚本,server.js是我的应用程序)
虽然配置更改后没有stopping
个事件,但如果我通过管理门户手动重启实例,则会收到stopping
事件。
所以问题很少:
stopping
个事件?谢谢!
答案 0 :(得分:1)
Azure假定您希望在配置更改后重新启动服务器,以便新设置可以正常生效。它不知道您是在运行期间还是仅在启动时继续读取配置设置。它还假设您的角色中部署了2台以上的服务器,并且一次重启一台服务器不会损害您的网站
所以,我不熟悉node.js,但是,在.NET中我们可以监视RoleEnvironment.Changing事件,捕获它并忽略它上面的重启。请查看此文章:http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleenvironment.changing.aspx在捕获更改事件后,您是否可以执行与您的函数委托类似的操作?
我认为停止事件仅适用于关闭/停止角色的情况。 http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleenvironment.stopping.aspx