Azure WorkerRole启动后立即停止

8
我有一个Azure WorkerRole,在没有任何异常抛出的情况下停止运行。它每次都在同一位置停止,但代码只是执行一个大约需要20秒钟的进程。有人能推测为什么会发生这种情况吗?我不知道OnStart()方法是否有超时限制?
以下是我的worker role正在发生的事情:
OnStart() -> 配置诊断
Run() -> 1. 设置定时器(60)以触发应用程序的主要部分 2. 启动新线程以加载一些默认设置(需要大约30秒)
代码永远无法到达#1的主要部分。
对于上面的#1,我已经尝试过使用和不使用定时器(没有区别)。对于上面的#2,我已经尝试过使用和不使用启动新线程(没有区别)。
以下是我的worker role的调试输出:
WaWorkerHost.exe Information: 0 : deployment(108).ApiAzure.Workers.0 - Workers.OnStart()
Microsoft.WindowsAzure.ServiceRuntime Information: 202 : Role entrypoint . COMPLETED OnStart()
The thread 'Role Initialization Thread' (0x29fc) has exited with code 0 (0x0).
Microsoft.WindowsAzure.ServiceRuntime Information: 203 : Role entrypoint . CALLING   Run()
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Users\Jason A. Kiesel\Projects\FS_CITYSOURCED\WorkersAzure\bin\Stage\WorkersAzure.csx\roles\Workers\approot\FreedomSpeaks.Logging.dll', Symbols loaded.
Microsoft.WindowsAzure.ServiceRuntime Warning: 204 : Role entrypoint . COMPLETED Run() ==> ROLE RECYCLING INITIATED
Microsoft.WindowsAzure.ServiceRuntime Information: 503 : Role instance recycling is starting
The thread 'Role Start Thread' (0x1fa0) has exited with code 0 (0x0).
The thread '<No Name>' (0x1624) has exited with code 0 (0x0).
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll'
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll'
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll'
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Microsoft.WindowsAzure.ServiceRuntime Information: 205 : Role entrypoint . CALLING   OnStop()
WaWorkerHost.exe Information: 0 : deployment(108).ApiAzure.Workers.0 - Workers.OnStop()
Microsoft.WindowsAzure.ServiceRuntime Information: 206 : Role entrypoint . COMPLETED OnStop()
The thread 'Role Stop Thread' (0x2dac) has exited with code 0 (0x0).
The program '[12228] WaWorkerHost.exe: Managed (v4.0.30319)' has exited with code -66053 (0xfffefdfb).

1
我找出了应用程序崩溃的原因并进行了修复,但是我仍然不明白为什么工作角色首先会崩溃。在启动时触发的应用程序的“config”部分有一个方法需要运行相当长的时间。我将“config”代码的这一部分移动到按需运行(延迟加载)。这似乎解决了问题。 - Jason
你是怎么找出它为什么崩溃的?我似乎遇到了同样的问题,但如果没有异常,很难调试:/ - Dirk Boer
试错。一些启动方法比其他方法花费的时间更长。我注释掉了除第一个之外的所有方法,并逐个添加其他方法。当它在一个需要很长时间(大约30秒)的方法上崩溃时,我将这些较长的方法移动到延迟加载样式中。这解决了问题。 - Jason
2个回答

10

在模拟器版本1.6或更高版本中,Run()中的循环是不必要的。然而,今天我遇到了同样的问题。我花了几个小时找出原因,发现我的项目使用对Microsoft.Windows.Azure程序集版本1.7的引用,而我使用的仿真器是来自十月版本(1.8)。Web项目正常工作,但处理工作角色会像你所描述的那样立即启动并停止。OnStart、Run和OnStop根本没有被调用。当我将我的工作角色参考到1.8程序集时,它又开始工作了。又浪费了几个小时,谢谢微软...


@Alexey,你刚刚为我省了几个小时的调查时间。谢谢! :) - rui
欢迎,Azure SDK 版本确实让人头疼。 - Alexey Zimarev
我从MSDN下载了样例代码并在本地运行时发现 Microsoft.WindowsAzure.ServiceRuntime 的引用版本是 2.5.0.0,而最新版本为 2.7.0.0。将引用更新后问题解决了。需要进一步指出的是,在修复之前 OnStart 和 Run 中的断点都无法被触发。 - David Burg
今天也遇到了同样的问题,在升级SDK后对Microsoft.WindowsAzure.ServiceRuntime的引用出现错误。 - ken2k

7

没有看到代码,听起来你的Run方法正在退出。如果Run方法退出,角色将停止。在Visual Studio中添加到云项目时创建的默认工作角色的方式是在方法末尾放置一个无限循环。因此,你的代码可能类似于以下内容:

public override void Run()
{
    StartMyTimer();
    LoadDefaultSettings();

    while (true)
    {
        CheckToMakeSureSpawnedThreadsAreRunningOK();
        System.Threading.Thread.Sleep(10000);
    }
}

正如评论中smarx提到的那样,也可以使用System.Threading.Thread.Sleep(Timeout.Infinite)来代替循环。


主要是因为我没有想到。当你添加一个基本角色时,它的基本功能就是无限循环。尽管每X秒钟会写出一个跟踪消息,让你知道该角色仍在运行。当我构建我的早期工作角色之一时,我也看了一下这个循环,并想“浪费时间”,然后将其删除。导致像这里经历的问题。 - knightpfhor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接