polling for task status.

This commit is contained in:
2020-03-25 11:39:26 +01:00
parent e6561308e5
commit 2a8f4cbb8d
3 changed files with 77 additions and 37 deletions

View File

@@ -5,6 +5,7 @@ using FarmmapsApi.Models;
using FarmmapsApi.Services;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using static FarmmapsApi.Extensions;
namespace FarmmapsApiSamples
{
@@ -44,30 +45,10 @@ namespace FarmmapsApiSamples
if (myDriveRoot != null)
{
// create or get a cropfield
var cropfieldItem = await GetCreateCropfieldItem(myDriveRoot.Code);
// create or get target n item
var targetNItems = await
_farmmapsApiService.GetItemChildrenAsync(myDriveRoot.Code, USERINPUT_ITEMTYPE);
Item targetNItem;
if (targetNItems.Count == 0)
{
_logger.LogInformation("Creating targetN item");
var itemRequest = CreateTargetNItemRequest(myDriveRoot.Code);
targetNItem = await _farmmapsApiService.CreateItemAsync(itemRequest);
}
else
{
targetNItem = targetNItems[0];
}
await CalculateTargetN(cropfieldItem, targetNItem, 60);
await Task.Delay(2000);
var cropfieldItem = await GetOrCreateCropfieldItem(myDriveRoot.Code);
var targetN = await CalculateTargetN(cropfieldItem, 60);
_logger.LogInformation($"TargetN: {targetN}");
}
}
catch (Exception ex)
@@ -76,7 +57,7 @@ namespace FarmmapsApiSamples
}
}
private async Task<Item> GetCreateCropfieldItem(string parentItemCode)
private async Task<Item> GetOrCreateCropfieldItem(string parentItemCode)
{
var cropfieldItems = await
_farmmapsApiService.GetItemChildrenAsync(parentItemCode, "vnd.farmmaps.itemtype.cropfield");
@@ -101,8 +82,25 @@ namespace FarmmapsApiSamples
return await _farmmapsApiService.CreateItemAsync(cropfieldItemRequest);
}
private async Task<Item> CalculateTargetN(Item cropfieldItem, Item targetNItem, int targetYield)
private async Task<double> CalculateTargetN(Item cropfieldItem, int targetYield)
{
var targetNItems = await
_farmmapsApiService.GetItemChildrenAsync(cropfieldItem.ParentCode, USERINPUT_ITEMTYPE);
Item targetNItem;
if (targetNItems.Count == 0)
{
_logger.LogInformation("Creating targetN item");
var itemRequest = CreateTargetNItemRequest(cropfieldItem.ParentCode);
targetNItem = await _farmmapsApiService.CreateItemAsync(itemRequest);
}
else
{
targetNItem = targetNItems[0];
}
_logger.LogInformation($"Calculating targetN with targetYield: {targetYield}");
var nbsTargetNRequest = new TaskRequest {TaskType = VRANBS_TASK};
nbsTargetNRequest.attributes["operation"] = "targetn";
nbsTargetNRequest.attributes["inputCode"] = targetNItem.Code;
@@ -111,11 +109,19 @@ namespace FarmmapsApiSamples
nbsTargetNRequest.attributes["targetYield"] = targetYield.ToString();
string itemTaskCode = await _farmmapsApiService.QueueTaskAsync(cropfieldItem.Code, nbsTargetNRequest);
// poll task
// get target N item again
await PollTask(TimeSpan.FromSeconds(3), async (tokenSource) =>
{
var itemTask = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, itemTaskCode);
return targetNItem;
if (itemTask.State != ItemTaskState.Processing && itemTask.State != ItemTaskState.Scheduled)
tokenSource.Cancel();
});
var item = await _farmmapsApiService.GetItemAsync(targetNItem.Code);
if (item.Data.ContainsKey("TargetN"))
return item.Data["TargetN"].Value<double>();
return 0;
}
private ItemRequest CreateTargetNItemRequest(string parentItemCode)