public void StartWorkers() { var assembly = System.Reflection.Assembly.GetEntryAssembly(); // find all classes with CustomAttribute [ExternalTask("name")] var externalTaskWorkers = // from assembly in AppDomain.CurrentDomain.GetAssemblies() from t in assembly.GetTypes() let attributes = t.GetCustomAttributes(typeof(ExternalTaskTopic), true) where attributes != null && attributes.Length > 0 select new { Type = t, Attributes = attributes.Cast <ExternalTaskTopic>() }; foreach (var taskWorker in externalTaskWorkers) { var workerTopicName = taskWorker.Attributes.FirstOrDefault().TopicName; var retries = taskWorker.Attributes.FirstOrDefault().Retries; var retryTimeout = taskWorker.Attributes.FirstOrDefault().RetryTimeout; string[] variablesToFetch = null; var variableRequirements = taskWorker.Type.GetCustomAttributes(typeof(ExternalTaskVariableRequirements), true) .FirstOrDefault() as ExternalTaskVariableRequirements; if (variableRequirements != null) { variablesToFetch = variableRequirements.VariablesToFetch; } var constructor = taskWorker.Type.GetConstructor(Type.EmptyTypes); IExternalTaskAdapter adapter = (IExternalTaskAdapter)constructor.Invoke(null); // Now register it! Console.WriteLine("Register Task Worker for Topic '" + workerTopicName + "'"); ExternalTaskWorker worker = new ExternalTaskWorker(ExternalTaskService(), adapter, workerTopicName, retries, retryTimeout, variablesToFetch); workers.Add(worker); worker.StartWork(); } }
public IActionResult RetrievePayment([FromBody] String parameters) { var traceId = Guid.NewGuid().ToString(); var customerId = "0815"; // TODO: get somehow from retrievePaymentPayload var amount = 15; // TODO get somehow from retrievePaymentPayload SemaphoreSlim semaphore = new SemaphoreSlim(1); semaphore.Wait(); // aqcuire and release later if everything is done semaphors.Add(traceId, semaphore); ChargeCreditCard(traceId, customerId, amount); ExternalTaskWorker semaphoreWorker = startSempahoreWorker(traceId); var result = new Dictionary <String, String>(); result.Add("traceId", traceId); if (semaphore.Wait(TimeSpan.FromMilliseconds(500))) { semaphoreWorker.StopWork(); result.Add("status", "completed"); return(Ok(result)); // HTTP 200 } else { semaphoreWorker.StopWork(); result.Add("status", "pending"); return(Accepted(result)); // HTTP 202 } }
private static ExternalTaskWorker CreateExternalTaskWorker(string url) { HttpClient httpClient = new HttpClient(); httpClient.BaseAddress = new Uri(url); IExternalTaskAPI externalTaskApi = new ExternalTaskApiClientService(httpClient); ExternalTaskWorker externalTaskWorker = new ExternalTaskWorker(externalTaskApi); return(externalTaskWorker); }
public void StartWorkers() { var assembly = System.Reflection.Assembly.GetEntryAssembly(); var externalTaskWorkers = RetrieveExternalTaskWorkerInfo(assembly); foreach (var taskWorkerInfo in externalTaskWorkers) { Console.WriteLine($"Register Task Worker for Topic '{taskWorkerInfo.TopicName}'"); ExternalTaskWorker worker = new ExternalTaskWorker(ExternalTaskService, taskWorkerInfo); _workers.Add(worker); worker.StartWork(); } }
private static ExternalTaskWorker <object, SampleResult> CreateExternalTaskWorker(string topic) { var externalTaskWorker = new ExternalTaskWorker <object, SampleResult>( ProcessEngineUrl, identity, topic, MaxTaskToPoll, PollingTimeout, Callback <object, SampleResult> ); return(externalTaskWorker); }
public void StartWorkers(string assemblyName) { var assemblys = AppDomain.CurrentDomain.GetAssemblies().Where(x => x.FullName.Contains(assemblyName)); var assembly = (Assembly)assemblys.FirstOrDefault(); var externalTaskWorkers = RetrieveExternalTaskWorkerInfo(assembly); foreach (var taskWorkerInfo in externalTaskWorkers) { Console.WriteLine($"Register Task Worker for Topic '{taskWorkerInfo.TopicName}'"); ExternalTaskWorker worker = new ExternalTaskWorker(ExternalTaskService, taskWorkerInfo); _workers.Add(worker); worker.StartWork(); } }
public ExternalTaskWorker <TPayload, TResult> SubscribeToExternalTasksWithTopic <TPayload, TResult>( string topic, int maxTasks, int timeout, HandleExternalTaskAction <TPayload, TResult> handleAction ) where TPayload : new() where TResult : new() { var externalTaskWorker = new ExternalTaskWorker <TPayload, TResult>(this.processEngineUrl, this.Identity, topic, maxTasks, timeout, handleAction); externalTaskWorker.Start(); return(externalTaskWorker); }
public async void HandleExternalTask() { var identity = new TestIdentity(); var client = new HttpClient(); var url = "http://localhost:8000"; testObject = new ExternalTaskWorker <TestPayload, SampleResult>( url, identity, "TestTopic", 10, 10000, async(externalTask) => { return(await this.Callback(externalTask)); }); testObject.Start(); }
private static async Task RunWorker() { ExternalTaskWorker externalTaskWorker = Program.CreateExternalTaskWorker("http://localhost:8000"); IIdentity identity = new TestIdentity(); Console.WriteLine($"Warten auf Aufgaben für das Topic '{TOPIC}'."); await externalTaskWorker.WaitForHandle <TestPayload>(identity, TOPIC, MAX_TASKS, POLLING_TIMEOUT, async (externalTask) => { Console.WriteLine(""); Console.Write("Daten: "); Console.Write(JsonConvert.SerializeObject(externalTask)); Console.WriteLine(""); Console.WriteLine(""); var result = await Program.DoSomeLongWork(); var externalTaskFinished = new ExternalTaskFinished <TestResult>(externalTask.Id, result); return(externalTaskFinished); }); }