using System;
using System.Threading;
using Newtonsoft.Json;
using Sers.Core.Module.Api;
using Vit.Core.Module.Log;
using Vit.Core.Util.ComponentModel.Data;
using Vit.Core.Util.Net;
using Vit.Core.Util.Threading;
using Vit.Extensions;
namespace App.Robot.Station.Logical.Model
{
///
/// RepeatTaskHelp
///
public class Task
{
public string name => config.name;
public int id;
[JsonIgnore]
RepeatTaskHelp tasks = new RepeatTaskHelp();
public int RunningThreadCount => tasks.RunningThreadCount;
public bool IsRunning => tasks.IsRunning;
public int targetCount => config.threadCount * config.loopCountPerThread;
public int sumCount = 0;
public int sumFailCount = 0;
public int curCount=0;
public int failCount=0;
public TaskConfig config;
void StepUp(bool success)
{
Interlocked.Increment(ref curCount);
Interlocked.Increment(ref sumCount);
if (!success)
{
Interlocked.Increment(ref sumFailCount);
Interlocked.Increment(ref failCount);
}
}
public Task(TaskConfig config)
{
this.config = config;
tasks.threadCount = config.threadCount;
tasks.repeatCountPerThread = config.loopCountPerThread;
if (config.apiRoute.StartsWith("http"))
{
if (config.httpUseHttpUtil)
{
httpClient = new HttpClient();
httpClient_ReqParam = new HttpRequest
{
url = config.apiRoute,
body = config.apiArg,
httpMethod = config.httpMethod
};
tasks.action = ActionHttpClient;
}
else
{
httpUtil = new HttpUtil();
httpUtil_Request = new RequestParam
{
url = config.apiRoute,
body = config.apiArg,
Method = config.httpMethod
};
tasks.action = ActionHttpUtil;
}
}
else
{
tasks.action = ActionApiClient;
}
}
#region ActionHttpClient
HttpClient httpClient;
HttpRequest httpClient_ReqParam;
void ActionHttpClient()
{
bool success = false;
try
{
var ret = httpClient.Send(httpClient_ReqParam)?.data;
if (ret.success)
{
success = true;
}
else
{
if (config.logError)
Logger.Info("失败:ret:" + ret.Serialize());
}
}
catch (Exception ex)
{
Interlocked.Increment(ref failCount);
Logger.Error(ex);
}
StepUp(success);
Thread.Sleep(config.interval);
}
#endregion
#region ActionHttpUtil
HttpUtil httpUtil;
RequestParam httpUtil_Request;
void ActionHttpUtil()
{
bool success = false;
try
{
var ret = httpUtil.Ajax(httpUtil_Request);
if (ret.success)
{
success = true;
}
else
{
if (config.logError)
Logger.Info("失败:ret:" + ret.Serialize());
}
}
catch (Exception ex)
{
Interlocked.Increment(ref failCount);
Logger.Error(ex);
}
StepUp(success);
Thread.Sleep(config.interval);
}
#endregion
void ActionApiClient()
{
bool success = false;
try
{
var ret = ApiClient.CallRemoteApi(config.apiRoute, config.apiArg, config.httpMethod);
if (ret!=null && ret.success)
{
success = true;
}
else
{
if(config.logError)
Logger.Info("失败:ret:" + ret.Serialize());
}
}
catch (Exception ex)
{
Interlocked.Increment(ref failCount);
Logger.Error(ex);
}
StepUp(success);
if(config.interval>0)
Thread.Sleep(config.interval);
}
public void Start()
{
tasks.threadName = "Robot-"+ config.name;
curCount = 0;
failCount = 0;
tasks.Start();
}
public void Stop()
{
tasks.Stop();
}
}
}