C# Azure工作角色错误处理
如果出现问题,使用工作者角色有点棘手。我的工作者角色中出现异常,这将强制角色退出并重新启动 我决定实施azure诊断解决方案来记录正在发生的事情。当我尝试将消息写入跟踪时,它可以工作,但我无法捕获异常并记录它们。我用try-catch包围代码,并尝试将异常内容写入跟踪 这是正确的方法吗?为什么它不起作用?是否有更好的方法记录工作人员角色中的异常?非常感谢。我的代码是:C# Azure工作角色错误处理,c#,.net,azure,azure-worker-roles,C#,.net,Azure,Azure Worker Roles,如果出现问题,使用工作者角色有点棘手。我的工作者角色中出现异常,这将强制角色退出并重新启动 我决定实施azure诊断解决方案来记录正在发生的事情。当我尝试将消息写入跟踪时,它可以工作,但我无法捕获异常并记录它们。我用try-catch包围代码,并尝试将异常内容写入跟踪 这是正确的方法吗?为什么它不起作用?是否有更好的方法记录工作人员角色中的异常?非常感谢。我的代码是: public class WorkerRole : RoleEntryPoint { private cons
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();
}
}
process(id,points)是引发异常的方法。更准确地说,是在我尝试调用SQLAzure查询时。我知道诊断是有效的,因为当角色启动时,它调用Trace.TraceInformation(“启动工作者角色TrackProcessor”);它在存储表中作为台面可见。随着时间的推移,随着角色遇到异常并被迫重新启动,会出现更多消息。但是,日志中没有错误消息。是否已为辅助角色连接跟踪侦听器?看看: 工作者角色app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<trace>
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="AzureDiagnostics">
<filter type="" />
</add>
</listeners>
</trace>
</system.diagnostics>
</configuration>
如果Run()方法退出,那么您的工人将被回收。在日志被回收之前,工作人员可能没有时间将其转移到存储器中
最简单的解决方案是在捕获异常后不重新抛出它。然后,您的工作者角色将继续运行,直到手动关闭为止。在引发异常之前,是否可以尝试添加延迟?在节点上的monitor agent有机会将日志上载到diagnostics之前,您的角色可能已被回收。听起来很有希望,我将尝试。有没有办法强制诊断监视器按需而不是按计划保存数据?可以立即解决并立即重新启动角色。我会在记录错误后添加睡眠。根据错误,您的角色可能会尽可能快地处理while循环日志记录错误。