Azure Web作业功能状态为Never Finished

时间:2014-07-09 16:02:07

标签: azure azure-webjobs azure-webjobssdk

我在azure中创建了一个Web作业。 Web作业是一种持续运行的类型。当队列中有消息时,将调用Web作业功能。我可以通过azure存储资源管理器或mvc web app在队列中添加消息来调用Web作业功能。

Web作业是一个控制台应用程序,通过在本地运行命令行,花费大约一个小时的时间来执行工作。在调用Web作业时,它已成功启动但在一段时间后(大约5-10分钟),我发现函数Invoke status为" Never Finished"在web作业日志中。

所以我的问题如下: -

1)这个问题是由于长时间运行的任务造成的。

2)这个问题是由于处理过程中的任何错误造成的(但我可以在本地运行)

3)如果我从web作业添加的数据库中删除了记录,那么我发现该Web再次启动。为什么呢?

4)如果我需要在完成流程后从队列中删除消息?

以下是我从Web作业

调用的代码片段
namespace Scheduler
{
class Program
{
    static void Main()
    {

        JobHost host = new JobHost();
        host.RunAndBlock();
    }

    public static void ProcessQueueMessage([QueueTrigger("webjobschedularargs")] string schedularargs,
                                  [Blob("containername/blobname")]TextWriter writer)
    {
        //writer.WriteLine(inputText);
        string[] args = schedularargs.Split(new char[0]);

        RunProcess(args);
        writer.WriteLine(schedularargs);
    }

    private static void RunProcess(string[] args)
    {
        if (!Initialize())
        {
            // Log issue
            Console.WriteLine("Error!!! Unable to initialize.");
            Console.ReadKey(true);

            // We're done
            return;
        }

        #region Run processor

        var options = new Options();
        var timer = new Stopwatch();

        if (CommandLine.Parser.Default.ParseArguments(args, options))
        {
            Console.WriteLine("Processing: ");
            timer.Start();

            if (options.Profiles != null)
            {
                foreach (var profile in options.Profiles)
                {
                    Console.Write(profile + ", ");
                }
                Console.WriteLine();
            }

            if (options.Reports != null)
            {
                foreach (var report in options.Reports)
                {
                    Console.Write(report + ", ");
                }
                Console.WriteLine();
            }

            var processor = new Processor(options);
            processor.Start();
        }

        #endregion
        // Log reason why not valid command args

        //-----call run processor function

        timer.Stop();
        Console.WriteLine("Total time (ms): " + timer.ElapsedMilliseconds);
        Console.WriteLine("Done!!! Everything went ok.");

        //#if LOCAL
        //            Console.ReadKey(true);
        //#endif
    }



    private static bool Initialize()
    {
        // Set ninject values
        NinjectConfig.Start();

        // TODO: Set automapper values ??

        return true;
    }
}

}

编辑: -

我在azure中遇到以下错误..

[2014年7月10日15:50:52> 32a9e0:ERR]未处理的异常: Microsoft.WindowsAzure.Storage.StorageException:远程服务器返回错误:(404)Not Found。 ---> System.Net.WebException:远程服务器返回错误:(404)Not Found。

[2014年7月10日15:50:52> 32a9e0:ERR]在System.Net.HttpWebRequest.GetResponse()

[2014年7月10日15:50:52> 32a9e0:ERR] at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T](RESTCommand`1 cmd,IRetryPolicy policy,OperationContext operationContext)

[2014年7月10日15:50:52> 32a9e0:ERR] ---内部异常堆栈跟踪结束---

[2014年7月10日15:50:52> 32a9e0:ERR] at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T](RESTCommand`1 cmd,IRetryPolicy policy,OperationContext operationContext)

[2014年7月10日15:50:52> 32a9e0:ERR] at Microsoft.WindowsAzure.Storage.Queue.CloudQueue.UpdateMessage(CloudQueueMessage消息,TimeSpan visibilityTimeout,MessageUpdateFields updateFields,QueueRequestOptions选项,OperationContext operationContext)

[2014年7月10日15:50:52> 32a9e0:ERR]在Microsoft.Azure.Jobs.UpdateQueueMessageVisibilityCommand.TryExecute()

[2014年7月10日15:50:52> 32a9e0:ERR]在Microsoft.Azure.Jobs.LinearSpeedupTimerCommand.Execute()

[2014年7月10日15:50:52> Microsoft.Azure.Jobs.IntervalSeparationTimer.RunTimer(对象状态)中的32a9e0:ERR]

[2014年7月10日15:50:52> System.Threading.TimerQueueTimer.CallCallbackInContext(Object state)中的32a9e0:ERR]

[2014年7月10日15:50:52> 32a9e0:ERR] at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean preserveSyncCtx)

[2014年7月10日15:50:52> 32a9e0:ERR] at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean preserveSyncCtx)

[2014年7月10日15:50:52> 32a9e0:ERR]在System.Threading.TimerQueueTimer.CallCallback()

[2014年7月10日15:50:52> 32a9e0:ERR]在System.Threading.TimerQueueTimer.Fire()

[2014年7月10日15:50:52> 32a9e0:ERR]在System.Threading.TimerQueue.FireNextTimers()

[2014年7月10日15:50:52> 32a9e0:ERR] at System.Threading.TimerQueue.AppDomainTimerCallback()

[2014年7月10日15:50:52> 32a9e0:INFO] .............................................. .................................................. .................................................. ... [07/10/2014 15:50:52> 32a9e0:SYS ERR]由于退出代码-532462766

,作业失败

[2014年7月10日15:50:52> 32a9e0:SYS INFO]进程停止,等待0秒

[2014年7月10日15:50:52> 32a9e0:SYS INFO]状态已更改为PendingRestart

[2014年7月10日15:50:57> 32a9e0:SYS INFO]运行脚本' Scheduler.exe'使用脚本主机 - ' WindowsScriptHost'

[2014年7月10日15:50:57> 32a9e0:SYS INFO]状态已更改为正在运行

所以看看错误我试图从控制台应用程序本地执行相同的功能及其工作。运行多次后,我发现函数正在执行5分钟。所以如果有任何时间绑定运行任何函数网络工作。

感谢。

2 个答案:

答案 0 :(得分:3)

WebJobs sdk中似乎存在一个错误,它不会创建默认情况下应创建的blob容器,具体取决于创建存储帐户的时间和位置。我必须做的就是自己创建容器。

他们是:

天青的作业宿主输出
天青-webjobs的主机

这解决了我的问题。

答案 1 :(得分:1)

我发现如果在函数调用中将unicode字符传递给logger对象,则会出现问题。显然unicode不受支持,清理过程中的某些内容变坏,工作永远不会关闭。