如果出现问题,使用工人角色会有点棘手。我的工作角色出现异常,这迫使角色退出并重新启动。
我决定实施 azure 诊断解决方案来记录正在发生的事情。它可以工作,当我尝试编写要跟踪的消息时,但我无法捕获异常并记录它们。我用 try catch 包围我的代码,并尝试编写异常内容以进行跟踪。
这是正确的方法吗?为什么它不起作用?有没有更好的方法来记录工作角色中的异常?谢谢你。我的代码是:
public class WorkerRole : RoleEntryPoint
{
private const int WAIT_INTERVAL_SECONDS = 15;
public override void Run()
{
Trace.WriteLine("$projectname$ entry point called", "Information");
while (true)
{
try
{
string id = MainWCFRole.Storage.TrackProcessingQueueDAO.retrieveMsgContents();
if ((id != null) && (!id.Equals("")))
{
var points = MainWCFRole.Storage.TrackRawDataDAO.retrieve(id);
Processor.process(id, points);
}
else
{
Thread.Sleep(WAIT_INTERVAL_SECONDS * 1000);
}
}
catch (Exception ex)
{
Trace.TraceInformation("Something went wrong");
Trace.TraceError(ex.ToString());
throw ex;
}
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
DiagnosticMonitorConfiguration dmc = DiagnosticMonitor.GetDefaultInitialConfiguration();
dmc.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
dmc.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
dmc.WindowsEventLog.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
dmc.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
DiagnosticMonitor.Start("StorageConnectionString", dmc);
Trace.TraceInformation("Starting Worker Role TrackProcessor");
return base.OnStart();
}
}
Processor.process(id, points) 是抛出异常的方法。更准确地说,是当我尝试调用 SQL azure 查询时。我知道诊断有效,因为当角色启动时,它会调用 Trace.TraceInformation("Starting Worker Role TrackProcessor"); 它在表存储中作为消息可见。然后随着时间的推移会出现更多消息,因为角色遇到异常并被迫重新启动。但是,日志中没有错误消息。