Tôi có vai trò công nhân hoạt động hoàn hảo trong phát triển nhưng không hoạt động khi được triển khai. "Không hoạt động" là khá mơ hồ, nhưng đó thực sự là tất cả những gì tôi phải tiếp tục vì tôi không thấy bất kỳ lỗi nào hay bất cứ điều gì (trong bản ghi sự kiện anyway - có thể có một nơi khác tôi có thể xem). Tôi đã thêm một số phát biểu dấu vết vào mã của tôi và tôi thấy cái đầu tiên xuất hiện, nhưng không có cái nào khác.Windows Azure Worker Vai trò không vượt qua dòng mã đầu tiên
Mã 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 Code:
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());
}
}
Config:
<?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>
Khi người lao động có s tarted, nếu tôi nhìn vào WADLogsTable, tất cả những gì tôi thấy là "WorkerRole.OnStart()" và không có gì khác!
Bất kỳ ý tưởng nào về vấn đề có thể là gì hoặc cách khắc phục sự cố này sẽ được đánh giá cao.
Cập nhật: Nếu tôi dừng vai trò, tôi cũng không thấy bất kỳ câu lệnh gỡ lỗi nào từ phương thức OnStop()
.
Cập nhật: I phải có cấu hình nào đó không chính xác với chẩn đoán của tôi. Tôi nghĩ rằng tôi đã nhìn thấy gỡ lỗi của tôi đi ra một cách chính xác khi gỡ lỗi tại địa phương, nhưng nó quay ra tôi không. Tôi thấy mọi thứ trong cửa sổ đầu ra, nhưng tôi không thấy mọi thứ trong bảng lưu trữ. Tôi nhìn thấy các mục sau trong phát triển:
WorkerRole.OnStart()
WorkerRole.Initialize()
Configuring AutoMapper...
Tôi nhận ra rằng những dấu vết đầu ra được chỉ định kỳ tải lên, nhưng tôi đã chờ 5 phút hoặc lâu hơn, vì vậy tôi nghĩ rằng đây sẽ là đủ dài, kể từ khi tôi có nó đặt thành 1 phút.
Cập nhật: Theo đề nghị của @kwill trong phần ý kiến tôi đã cố gắng thêm một tập tin dấu vết người nghe như sau:
<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>
này hoạt động tốt trong môi trường phát triển của tôi và dường như đáng tin cậy hơn cũng như tôi nhận được tất cả các gỡ lỗi mà tôi mong đợi. Tuy nhiên, khi triển khai nó để dàn dựng, tệp TextWriterOutput.log thậm chí không được tạo!
Tôi thực sự cần một cách đáng tin cậy để gỡ lỗi vai trò công nhân để tôi có thể khắc phục vấn đề cuối cùng, đó là công việc của tôi không hoạt động - tại thời điểm này tôi vẫn không biết họ đang cố gắng gì để làm như tôi không thể nhận được bất kỳ gỡ lỗi ra!
Cập nhật: Tôi khá chắc chắn rằng ý tưởng dll bị thiếu được đề xuất bởi hầu hết mọi người không phải là vấn đề. Để hy vọng chứng minh điều này, tôi đã ghi đè lên phương thức chạy như hình dưới đây và tôi thấy lỗi "Nhịp tim ..." xuất hiện. Dường như với tôi rằng chức năng chẩn đoán hoặc ít nhất là cách tôi đã cấu hình nó là không đáng tin cậy, điều đó ngăn cản tôi điều tra lý do tại sao trên trái đất công việc của tôi không chạy.
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");
}
}
Cập nhật: bây giờ tôi đã qua bài đăng vấn đề này trên các Windows Azure MSDN forum.
Cập nhật: Như đã đề xuất trong nhận xét, tôi hiện đã thử xóa tất cả mã 'hữu ích'. Trong quá trình phát triển, điều này dẫn đến tất cả các lỗi được tạo ra. Sau đó tôi đã thử chỉ cần xóa cuộc gọi đến AutomapperConfiguration.Configure()
vì trước đây tôi không thấy gì xảy ra sau cuộc gọi đó. Điều này dẫn đến một số câu lệnh theo dõi không xuất hiện trở lại. Tuy nhiên, quan trọng hơn, tôi đã nhìn thấy các phát biểu dấu vết mà tôi đã đưa vào "công việc". Vì đó là công việc không chạy mà cuối cùng tôi muốn giải quyết, tôi đã triển khai phiên bản mã đó để dàn dựng, nhưng tôi chỉ thấy dấu vết OnStart() và dấu vết "nhịp tim". Tôi không nghĩ rằng điều này thực sự hữu ích, nhưng có lẽ nó sẽ cung cấp cho ai đó một số ý tưởng.
Bạn đã thiết lập đúng tài khoản lưu trữ của mình cho chẩn đoán chưa? Một số người quên bỏ cài đặt LocalStorage – Igorek
Tôi tin như vậy. Tôi nhận được một mục trong bảng mà dường như chứng minh rằng lý thuyết. Ngoài ra, tôi đã làm sai lầm đó ban đầu, nhưng VS sẽ không xây dựng các gói với nó còn lại như thế. – s1mm0t
Điều gì sẽ xảy ra nếu bạn xóa tất cả mã 'hữu ích' khỏi tất cả các phương thức và chỉ để lại các cuộc gọi 'Trace.WriteLine' và triển khai để dàn dựng? Vẫn không có tin nhắn ngoại trừ tin nhắn đầu tiên? –