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 ExternalTaskWorker(ExternalTaskService service, IExternalTaskAdapter adapter, String topicName, int retries, long retryTimeout, String[] variablesToFetch)
 {
     this.adapter          = adapter;
     this.topicName        = topicName;
     this.variablesToFetch = variablesToFetch;
     this.service          = service;
     this.retries          = retries;
     this.retryTimeout     = retryTimeout;
 }