我有一個工作角色,可以在開發中完美工作,但部署時不起作用。 「不起作用」是相當含糊的,但這就是我所要做的,因爲我沒有看到任何錯誤或任何事情(無論如何,在事件日誌中 - 也許有其他地方我可以看)。我在代碼中添加了一些跟蹤語句,我看到第一個出來,但沒有其他人。Windows Azure Worker角色沒有通過代碼的第一行
WorkerRole代碼:
public class WorkerRole : RoleEntryPoint
{
#region Member variables
private IWindsorContainer _container;
private IJob[] _jobs;
#endregion
#region Methods
public override bool OnStart()
{
ConfigureDiagnostics();
Trace.WriteLine("WorkerRole.OnStart()");
try
{
Initialize();
Trace.WriteLine("Resolving jobs...");
_jobs = _container.ResolveAll<IJob>();
StartJobs();
return base.OnStart();
}
catch (Exception ex)
{
TraceUtil.TraceException(ex);
throw;
}
finally
{
Trace.WriteLine("WorkerRole.OnStart - Complete");
Trace.Flush();
}
}
/// <summary>
/// Sets up diagnostics.
/// </summary>
private void ConfigureDiagnostics()
{
DiagnosticMonitorConfiguration dmc =
DiagnosticMonitor.GetDefaultInitialConfiguration();
dmc.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
dmc.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
DiagnosticMonitor.Start(Constants.DiagnosticsConnectionString, dmc);
}
/// <summary>
/// Sets up the IoC container etc.
/// </summary>
private void Initialize()
{
Trace.WriteLine("WorkerRole.Initialize()");
try
{
Trace.WriteLine("Configuring AutoMapper...");
AutoMapperConfiguration.Configure();
Trace.WriteLine("Configuring Windsor...");
_container = new WindsorContainer();
Trace.WriteLine(string.Format("Installing assemblies from directory...{0}",
Path.Combine(Environment.GetEnvironmentVariable(Constants.RoleRoot), Constants.AppRoot)));
_container.Install(FromAssembly.InDirectory(
new AssemblyFilter(Path.Combine(Environment.GetEnvironmentVariable(Constants.RoleRoot), Constants.AppRoot))));
Trace.WriteLine(string.Format("Setting the default connection limit..."));
ServicePointManager.DefaultConnectionLimit = 12;
}
finally
{
Trace.WriteLine("WorkerRole.Initialize - Complete");
}
}
/// <summary>
/// Starts all of the jobs.
/// </summary>
private void StartJobs()
{
Trace.WriteLine("WorkerRole.StartJobs()");
try
{
foreach (IJob job in _jobs)
{
job.Start();
}
}
finally
{
Trace.WriteLine("WorkerRole.StartJobs - Complete");
}
}
public override void OnStop()
{
Trace.WriteLine("WorkerRole.OnStop()");
try
{
foreach (IJob job in _jobs)
{
job.Stop();
}
_container.Dispose();
}
finally
{
Trace.WriteLine("WorkerRole.OnStop - Complete");
}
}
#endregion
#region Private util classes
public static class AutoMapperConfiguration
{
public static void Configure()
{
Mapper.Initialize(x => x.AddProfile<ModelProfile>());
}
}
#endregion
}
TraceUtil代碼:
public static class TraceUtil
{
public static void TraceException(Exception ex)
{
StringBuilder buffer = new StringBuilder();
while (ex != null)
{
buffer.AppendFormat("{0} : ", ex.GetType());
buffer.AppendLine(ex.Message);
buffer.AppendLine(ex.StackTrace);
ex = ex.InnerException;
}
Trace.TraceError(buffer.ToString());
}
}
配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
<system.diagnostics>
<trace autoflush="true">
<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>
一旦工人爲S tarted,如果我看WADLogsTable,我看到的只是「WorkerRole.OnStart()」,沒有別的!
任何想法可能是什麼問題或如何解決這個問題將不勝感激。
更新:如果我停止角色,我看不到OnStop()
方法的任何調試語句。
更新:我必須有話跟我的診斷配置不正確。我以爲我在本地調試時看到我的調試正確無誤,但事實證明我沒有。我看到輸出窗口中的所有內容,但我在存儲表中看不到所有內容。我看到下面的條目中發展:
WorkerRole.OnStart()
WorkerRole.Initialize()
Configuring AutoMapper...
我意識到,跟蹤輸出僅定期上傳的,但我已經等了5分鐘左右,所以我想這應該是足夠長的時間,因爲我有設置爲1分鐘。
更新:正如在評論部分@kwill建議我嘗試添加文件跟蹤偵聽如下:
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="AzureDiagnostics">
</add>
<add name="File" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\TextWriterOutput.log" />
</listeners>
</trace>
</system.diagnostics>
這工作正常,在我的開發環境,似乎更可靠以及我獲得我期望的所有調試。但是,當我將它部署到舞臺時,甚至不會創建TextWriterOutput.log文件!
我真的需要一種可靠的方式從我的工作者角色獲取調試,以便我可以解決最終問題,這是我的工作無法正常工作 - 在這一點上,我仍然不知道他們甚至嘗試了什麼做我無法得到任何調試!
更新:我很肯定,大多數人提出的缺失的dll想法不是問題。爲了有希望證明這一點,我已經重寫了下面所示的run方法,並且我看到「Heartbeat ...」調試出來了。在我看來,無論是診斷功能還是至少我配置的方式都不可靠,這都阻止我調查爲什麼地球上的工作沒有運行。
public override void Run()
{
Trace.WriteLine("LearningMiles.JobProcessor.WorkerRole.Run()", "Information");
try
{
while (true)
{
Thread.Sleep(10000);
Trace.WriteLine("Heartbeat...", "Verbose");
}
}
catch (Exception ex)
{
TraceUtil.TraceException(ex);
throw;
}
finally
{
Trace.WriteLine("LearningMiles.JobProcessor.WorkerRole.Run() - Complete", "Information");
}
}
更新:我現在已經交叉張貼這個問題上Windows Azure MSDN forum。
更新:正如評論中所建議的,我現在已經嘗試刪除所有'有用'的代碼。在開發中,這導致了所有的調試輸出。然後我嘗試只是刪除電話AutomapperConfiguration.Configure()
,因爲以前我沒有看到任何後出來的電話。這導致一些跟蹤陳述不再出現。但是,重要的是,我看到了我在「工作」中提出的跟蹤陳述。由於最終要解決的是未運行的作業,因此我將該版本的代碼部署到了暫存中,但在那裏我只看到OnStart()跟蹤和「心跳」跟蹤。我不認爲這真的有幫助,但也許它會給人一些想法。
您是否正確設置了您的存儲帳戶以進行診斷?有些人忘記刪除LocalStorage設置 – Igorek 2012-02-23 17:48:21
我相信如此。我在表格中看到一個似乎證明理論的條目。另外,我最初確實犯了這個錯誤,但是VS不會像這樣創建它。 – s1mm0t 2012-02-23 17:53:34
如果您從所有方法中刪除所有「有用」代碼,並且只保留「Trace.WriteLine」調用並將其部署到分段中,會發生什麼情況?除了第一個消息還沒有消息? – 2012-02-27 18:34:06