public static async Task <HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "getposts/{blogname}")] HttpRequestMessage req, string blogname, TraceWriter log) { Startup.Init(); PostsGetter postsGetter = new PostsGetter(); GetPostsResult result = await postsGetter.GetPosts(log, blogname); return(req.CreateResponse(HttpStatusCode.OK, "Queued " + result.TotalReceived + "/" + result.TotalInBlog + " posts for processing, success " + result.Success)); }
public static async Task Run([TimerTrigger("0 25 * * * *")] TimerInfo myTimer, TraceWriter log) { Startup.Init(); log.Info($"C# Timer trigger function executed at: {DateTime.Now}"); BlogToFetchQueueAdapter blogToFetchQueueAdapter = new BlogToFetchQueueAdapter(); blogToFetchQueueAdapter.Init(); BlogInfoTableAdapter blogInfoTableAdapter = new BlogInfoTableAdapter(); blogInfoTableAdapter.Init(); PostsGetter postsGetter = new PostsGetter(); Stopwatch stopwatch = Stopwatch.StartNew(); bool success; // basically means that can the message be deleted, or if it needs to be left in queue to be resumed later do { //TODO: error handling, if there is error from e.g. postsGetter CloudQueueMessage message = await blogToFetchQueueAdapter.GetNextMessage(); if (message == null) { return; } BlogToFetch blogToFetch = JsonConvert.DeserializeObject <BlogToFetch>(message.AsString); BlogEntity blogEntity = await blogInfoTableAdapter.GetBlog(blogToFetch.Blogname); long timeoutLeft = 270 - stopwatch.ElapsedMilliseconds / 1000; if (timeoutLeft < 10) { return; } success = false; GetPostsResult result = null; if (blogToFetch.NewerThan.HasValue) { result = await postsGetter.GetNewerPosts(log, blogToFetch.Blogname, blogToFetch.NewerThan.Value, timeoutLeft); if (result.Success) { success = true; } } int offset = 0; if (blogEntity?.FetchedUntilOffset != null && !blogToFetch.UpdateNpf) { offset = blogEntity.FetchedUntilOffset.Value; } if (result != null) { offset += (int)result.TotalReceived; } if (blogEntity != null && (!blogEntity.FetchedUntilOffset.HasValue || blogEntity.FetchedUntilOffset.Value < Constants.MaxPostsToFetch)) { result = await postsGetter.GetPosts(log, blogToFetch.Blogname, offset, timeoutSeconds : timeoutLeft, updateNpf : blogToFetch.UpdateNpf); if (result.Success) { success = true; } } else { success = true; // enough fetched already, message can be deleted } if (success) { await blogToFetchQueueAdapter.DeleteMessage(message); } } while (success); }