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);
        }
Beispiel #4
0
        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);
        }
Beispiel #6
0
        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();
            }
        }
Beispiel #7
0
        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);
            });
        }