예제 #1
0
        static void Main(string[] args)
        {
            AppSettingsReader reader = new AppSettingsReader();
            string            servicebusConnectionString = reader.GetValue("Microsoft.ServiceBus.ConnectionString", typeof(string)).ToString();
            string            taskHubName = reader.GetValue("TaskHubName", typeof(string)).ToString();

            TaskHubClient taskHubClient = new TaskHubClient(taskHubName, servicebusConnectionString);
            TaskHubWorker taskHub       = new TaskHubWorker(taskHubName, servicebusConnectionString);

            taskHub.DeleteHub();
            taskHub.CreateHubIfNotExists();

            OrchestrationInstance instance = null;

            string instanceId = "TestTaskHub : " + Guid.NewGuid();

            taskHub.AddTaskOrchestrations((typeof(TaskHubProcessingOrchestration)));
            taskHub.AddTaskActivitiesFromInterface <IActivityFunction>(new ActivityImplementor(), true);
            taskHub.AddTaskActivities(new GetUserTask());

            instance = taskHubClient.CreateOrchestrationInstance(typeof(TaskHubProcessingOrchestration), instanceId, "hello");

            taskHub.Start();
            Console.WriteLine("Press any key to quit.");
            Console.ReadLine();
            taskHub.Stop(true);
        }
        /// <summary>
        /// Registers the collection of services.
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public ICollection <MicroserviceInstance> LoadServices(ICollection <Microservice> services)
        {
            loadTypesFromQualifiedNames(services);

            m_TaskHubWorker.AddTaskOrchestrations(services.Select(s => s.Orchestration).ToArray());

            List <Type> taskActivities      = new List <Type>();
            List <Type> interfaceActivities = new List <Type>();

            foreach (var task in services.SelectMany(s => s.Activities))
            {
                if (taskActivities.Contains(task) == false)
                {
                    if (typeof(TaskActivity).IsAssignableFrom(task))
                    {
                        taskActivities.Add(task);
                    }
                    else
                    {
                        interfaceActivities.Add(task);
                    }
                }
            }

            // Interface based tasks (do not implement TaskActivity)
            if (interfaceActivities.Count > 0)
            {
                m_TaskHubWorker.AddTaskActivitiesFromInterface(interfaceActivities);
            }

            // Classic task activities.
            m_TaskHubWorker.AddTaskActivities(taskActivities.ToArray());

            List <MicroserviceInstance> allRunningInstances = new List <MicroserviceInstance>();

            foreach (var svc in services)
            {
                List <MicroserviceInstance> runningInstances;
                bool isRunning = loadRunningInstances(svc.OrchestrationQName, out runningInstances);
                if (runningInstances != null)
                {
                    allRunningInstances.AddRange(runningInstances);
                }

                RegisterServiceConfiguration(svc);
            }

            return(allRunningInstances);
        }
예제 #3
0
        static async Task Main(string[] args)
        {
            //Use Azurite emulator
            string storageConnectionString = "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;" +
                                             "BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1";
            string taskHubName = "RetryTest";

            var settings = new AzureStorageOrchestrationServiceSettings();

            settings.StorageConnectionString      = storageConnectionString;
            settings.TaskHubName                  = taskHubName;
            settings.UseDataContractSerialization = true;

            var orchestrationServiceAndClient = new AzureStorageOrchestrationService(settings);
            await orchestrationServiceAndClient.CreateIfNotExistsAsync();

            var taskHubClient = new TaskHubClient(orchestrationServiceAndClient);
            var taskHub       = new TaskHubWorker(orchestrationServiceAndClient);

            // add instance
            _ = Task.Run(async() =>
            {
                OrchestrationInstance ins = await taskHubClient.CreateOrchestrationInstanceAsync(typeof(HelloOrchestration), "b", "");
            });

            // add worker
            try
            {
                taskHub.AddTaskOrchestrations(
                    typeof(HelloOrchestration)
                    );

                taskHub.AddTaskActivitiesFromInterface <IFailedTask>(new FailedTask());


                await taskHub.StartAsync();

                //Console.WriteLine("Press any key to quit.");
                Console.ReadLine();
                taskHub.StopAsync(true).Wait();
            }
            catch (Exception e)
            {
                // silently eat any unhandled exceptions.
                Console.WriteLine($"worker exception: {e}");
            }
        }
예제 #4
0
        public static void StartWorker(TaskHubWorker taskHub)
        {
            try
            {
                Console.WriteLine("Starting DurableTask worker...");
                IUtilitySignupActivities utilitySignupActivities = new UtilitySignupActivities();
                taskHub.AddTaskActivitiesFromInterface <IUtilitySignupActivities>(utilitySignupActivities);
                taskHub.AddTaskOrchestrations(typeof(UtilitySignupOrchestration));

                taskHub.Start();

                Console.WriteLine("DurableTask worker successfully started.  Press any key to quit.");
                Console.ReadLine();

                taskHub.Stop(true);
            }
            catch (Exception)
            {
                // silently eat any unhandled exceptions.
            }
        }
예제 #5
0
        static void Main(string[] args)
        {
            eventListener = new ObservableEventListener();
            eventListener.LogToConsole();
            eventListener.EnableEvents(DefaultEventSource.Log, EventLevel.LogAlways);

            if (CommandLine.Parser.Default.ParseArgumentsStrict(args, ArgumentOptions))
            {
                string serviceBusConnectionString = GetSetting("ServiceBusConnectionString");
                string storageConnectionString    = GetSetting("StorageConnectionString");
                string taskHubName = ConfigurationManager.AppSettings["taskHubName"];

                //IOrchestrationServiceInstanceStore instanceStore = new AzureTableInstanceStore(taskHubName, storageConnectionString);

                //var orchestrationServiceAndClient =
                //    new ServiceBusOrchestrationService(serviceBusConnectionString, taskHubName, instanceStore, null, null);

                var orchestrationServiceAndClient =
                    new DurableTask.Emulator.LocalOrchestrationService();

                var taskHubClient = new TaskHubClient(orchestrationServiceAndClient);
                var taskHub       = new TaskHubWorker(orchestrationServiceAndClient);

                if (ArgumentOptions.CreateHub)
                {
                    orchestrationServiceAndClient.CreateIfNotExistsAsync().Wait();
                }

                OrchestrationInstance instance = null;

                if (!string.IsNullOrWhiteSpace(ArgumentOptions.StartInstance))
                {
                    string instanceId = ArgumentOptions.InstanceId ?? Guid.NewGuid().ToString();
                    Console.WriteLine($"Start Orchestration: {ArgumentOptions.StartInstance}");
                    switch (ArgumentOptions.StartInstance)
                    {
                    case "Greetings":
                        instance = taskHubClient.CreateOrchestrationInstanceAsync(typeof(GreetingsOrchestration), instanceId, null).Result;
                        break;

                    case "Greetings2":
                        if (ArgumentOptions.Parameters == null || ArgumentOptions.Parameters.Length != 1)
                        {
                            throw new ArgumentException("parameters");
                        }

                        instance = taskHubClient.CreateOrchestrationInstanceAsync(typeof(GreetingsOrchestration2), instanceId,
                                                                                  int.Parse(ArgumentOptions.Parameters[0])).Result;
                        break;

                    case "Cron":
                        // Sample Input: "0 12 * */2 Mon"
                        instance = taskHubClient.CreateOrchestrationInstanceAsync(typeof(CronOrchestration), instanceId,
                                                                                  (ArgumentOptions.Parameters != null && ArgumentOptions.Parameters.Length > 0) ? ArgumentOptions.Parameters[0] : null).Result;
                        break;

                    case "Average":
                        // Sample Input: "1 50 10"
                        if (ArgumentOptions.Parameters == null || ArgumentOptions.Parameters.Length != 3)
                        {
                            throw new ArgumentException("parameters");
                        }

                        int[] input = ArgumentOptions.Parameters.Select(p => int.Parse(p)).ToArray();
                        instance = taskHubClient.CreateOrchestrationInstanceAsync(typeof(AverageCalculatorOrchestration), instanceId, input).Result;
                        break;

                    case "ErrorHandling":
                        instance = taskHubClient.CreateOrchestrationInstanceAsync(typeof(ErrorHandlingOrchestration), instanceId, null).Result;
                        break;

                    case "SumOfSquares":
                        instance = taskHubClient.CreateOrchestrationInstanceAsync(
                            "SumOfSquaresOrchestration",
                            "V1",
                            instanceId,
                            File.ReadAllText("SumofSquares\\BagOfNumbers.json"),
                            new Dictionary <string, string>(1)
                        {
                            { "Category", "testing" }
                        }).Result;
                        break;

                    case "Signal":
                        instance = taskHubClient.CreateOrchestrationInstanceAsync(typeof(SignalOrchestration), instanceId, null).Result;
                        break;

                    case "SignalAndRaise":
                        if (ArgumentOptions.Parameters == null || ArgumentOptions.Parameters.Length != 1)
                        {
                            throw new ArgumentException("parameters");
                        }

                        instance = taskHubClient.CreateOrchestrationInstanceWithRaisedEventAsync(typeof(SignalOrchestration), instanceId, null, ArgumentOptions.Signal, ArgumentOptions.Parameters[0]).Result;
                        break;

                    case "Replat":
                        instance = taskHubClient.CreateOrchestrationInstanceAsync(typeof(MigrateOrchestration), instanceId,
                                                                                  new MigrateOrchestrationData {
                            SubscriptionId = "03a1cd39-47ac-4a57-9ff5-a2c2a2a76088", IsDisabled = false
                        }).Result;
                        break;

                    default:
                        throw new Exception("Unsupported Orchestration Name: " + ArgumentOptions.StartInstance);
                    }

                    Console.WriteLine("Workflow Instance Started: " + instance);
                }
                else if (!string.IsNullOrWhiteSpace(ArgumentOptions.Signal))
                {
                    Console.WriteLine("Run RaiseEvent");

                    if (string.IsNullOrWhiteSpace(ArgumentOptions.InstanceId))
                    {
                        throw new ArgumentException("instanceId");
                    }

                    if (ArgumentOptions.Parameters == null || ArgumentOptions.Parameters.Length != 1)
                    {
                        throw new ArgumentException("parameters");
                    }

                    string instanceId = ArgumentOptions.InstanceId;
                    instance = new OrchestrationInstance {
                        InstanceId = instanceId
                    };
                    taskHubClient.RaiseEventAsync(instance, ArgumentOptions.Signal, ArgumentOptions.Parameters[0]).Wait();

                    Console.WriteLine("Press any key to quit.");
                    Console.ReadLine();
                }

                if (!ArgumentOptions.SkipWorker)
                {
                    try
                    {
                        taskHub.AddTaskOrchestrations(
                            typeof(GreetingsOrchestration),
                            typeof(GreetingsOrchestration2),
                            typeof(CronOrchestration),
                            typeof(AverageCalculatorOrchestration),
                            typeof(ErrorHandlingOrchestration),
                            typeof(SignalOrchestration),
                            typeof(MigrateOrchestration),
                            typeof(SumOfSquaresOrchestration)
                            );

                        taskHub.AddTaskOrchestrations(
                            new NameValueObjectCreator <TaskOrchestration>("SumOfSquaresOrchestration", "V1", typeof(SumOfSquaresOrchestration)));

                        taskHub.AddTaskActivities(
                            new GetUserTask(),
                            new SendGreetingTask(),
                            new CronTask(),
                            new ComputeSumTask(),
                            new GoodTask(),
                            new BadTask(),
                            new CleanupTask(),
                            new EmailTask(),
                            new SumOfSquaresTask()
                            );

                        taskHub.AddTaskActivitiesFromInterface <IManagementSqlOrchestrationTasks>(new ManagementSqlOrchestrationTasks());
                        taskHub.AddTaskActivitiesFromInterface <IMigrationTasks>(new MigrationTasks());

                        taskHub.StartAsync().Wait();

                        Console.WriteLine("Waiting up to 60 seconds for completion.");

                        OrchestrationState taskResult = taskHubClient.WaitForOrchestrationAsync(instance, TimeSpan.FromSeconds(60), CancellationToken.None).Result;
                        Console.WriteLine($"Task done: {taskResult?.OrchestrationStatus}");

                        Console.WriteLine("Press any key to quit.");
                        Console.ReadLine();

                        taskHub.StopAsync(true).Wait();
                    }
                    catch (Exception e)
                    {
                        // silently eat any unhandled exceptions.
                        Console.WriteLine($"worker exception: {e}");
                    }
                }
                else
                {
                    Console.WriteLine("Skip Worker");
                }
            }
        }
예제 #6
0
        /// <summary>
        /// This is the main entry point for your service replica.
        /// This method executes when this replica of your service becomes primary and has write status.
        /// </summary>
        /// <param name="cancellationToken">Canceled when Service Fabric needs to shut down this service replica.</param>
        protected override async Task RunAsync(CancellationToken cancellationToken)
        {
            try
            {
                var taskProvider = (new FabricOrchestrationProviderFactory(StateManager)).CreateProvider();

                var taskHubClient = new TaskHubClient(taskProvider.OrchestrationServiceClient);
                var taskHub       = new TaskHubWorker(taskProvider.OrchestrationService);

                OrchestrationInstance instance = null;

                var instanceId = Guid.NewGuid().ToString();
                ServiceEventSource.Current.Message($"Start orchestration");
                // instance = await taskHubClient.CreateOrchestrationInstanceAsync(typeof(CronOrchestration), instanceId,
                //     "0 12 **/2 Mon");

                int[] input = { 10, 50, 10 };
                instance = await taskHubClient.CreateOrchestrationInstanceAsync(typeof(AverageCalculatorOrchestration),
                                                                                instanceId, input);

                // instance = await taskHubClient.CreateOrchestrationInstanceAsync(typeof(MigrateOrchestration),
                //     instanceId,
                //     new MigrateOrchestrationData
                //         {SubscriptionId = "03a1cd39-47ac-4a57-9ff5-a2c2a2a76088", IsDisabled = false});


                taskHub.AddTaskOrchestrations(
                    typeof(CronOrchestration),
                    typeof(AverageCalculatorOrchestration),
                    typeof(ErrorHandlingOrchestration),
                    typeof(SignalOrchestration),
                    typeof(MigrateOrchestration));

                taskHub.AddTaskActivities(
                    new CronTask(),
                    new ComputeSumTask(),
                    new GoodTask(),
                    new BadTask(),
                    new CleanupTask());

                taskHub.AddTaskActivitiesFromInterface <IManagementSqlOrchestrationTasks>(
                    new ManagementSqlOrchestrationTasks());
                taskHub.AddTaskActivitiesFromInterface <IMigrationTasks>(new MigrationTasks());

                taskHub.StartAsync().Wait();

                ServiceEventSource.Current.Message("Waiting up to 60 seconds for completion");

                var taskResult =
                    await taskHubClient.WaitForOrchestrationAsync(instance, TimeSpan.FromSeconds(60),
                                                                  CancellationToken.None);

                ServiceEventSource.Current.Message($"Task done: {taskResult.OrchestrationStatus}");

                await taskHub.StopAsync(true);
            }
            catch (Exception ex)
            {
                ServiceEventSource.Current.Message($"worker exception: {ex}");
            }
        }
예제 #7
0
        static void Main(string[] args)
        {
            if (CommandLine.Parser.Default.ParseArgumentsStrict(args, options))
            {
                string servicebusConnectionString = Program.GetSetting("ServiceBusConnectionString");
                string storageConnectionString = Program.GetSetting("StorageConnectionString");
                string taskHubName = ConfigurationManager.AppSettings["taskHubName"];

                TaskHubClient taskHubClient = new TaskHubClient(taskHubName, servicebusConnectionString, storageConnectionString);
                TaskHubWorker taskHub = new TaskHubWorker(taskHubName, servicebusConnectionString, storageConnectionString);

                if (options.CreateHub)
                {
                    taskHub.CreateHub();
                }

                if (!string.IsNullOrWhiteSpace(options.StartInstance))
                {
                    string instanceId = options.InstanceId;
                    OrchestrationInstance instance = null;
                    switch (options.StartInstance)
                    {
                        case "Greetings":
                            instance = taskHubClient.CreateOrchestrationInstance(typeof(GreetingsOrchestration), instanceId, null);
                            break;
                        case "Greetings2":
                            if (options.Parameters == null || options.Parameters.Length != 1)
                            {
                                throw new ArgumentException("parameters");
                            }
                            instance = taskHubClient.CreateOrchestrationInstance(typeof(GreetingsOrchestration2), instanceId, 
                                int.Parse(options.Parameters[0]));
                            break;
                        case "Cron":
                            // Sample Input: "0 12 * */2 Mon"
                            instance = taskHubClient.CreateOrchestrationInstance(typeof(CronOrchestration), instanceId, 
                                (options.Parameters != null && options.Parameters.Length > 0) ? options.Parameters[0] : null);
                            break;
                        case "Average":
                            // Sample Input: "1 50 10"
                            if (options.Parameters == null || options.Parameters.Length != 3)
                            {
                                throw new ArgumentException("parameters");
                            }
                            int[] input = options.Parameters.Select(p => int.Parse(p)).ToArray();
                            instance = taskHubClient.CreateOrchestrationInstance(typeof(AverageCalculatorOrchestration), instanceId, input);
                            break;
                        case "ErrorHandling":
                            instance = taskHubClient.CreateOrchestrationInstance(typeof(ErrorHandlingOrchestration), instanceId, null);
                            break;
                        case "Signal":
                            instance = taskHubClient.CreateOrchestrationInstance(typeof(SignalOrchestration), instanceId, null);
                            break;
                        case "Replat":
                            instance = taskHubClient.CreateOrchestrationInstance(typeof(MigrateOrchestration), instanceId,
                                new MigrateOrchestrationData() { SubscriptionId = "03a1cd39-47ac-4a57-9ff5-a2c2a2a76088", IsDisabled = false });
                            break;
                        default:
                            throw new Exception("Unsupported Orchestration Name: " + options.StartInstance);
                    }

                    Console.WriteLine("Workflow Instance Started: " + instance);
                }
                else if (!string.IsNullOrWhiteSpace(options.Signal))
                {
                    if (string.IsNullOrWhiteSpace(options.InstanceId)) 
                    {
                        throw new ArgumentException("instantceId");
                    }
                    if (options.Parameters == null || options.Parameters.Length != 1)
                    {
                        throw new ArgumentException("parameters");

                    }
                    string instanceId = options.InstanceId;
                    OrchestrationInstance instance = new OrchestrationInstance { InstanceId = instanceId };
                    taskHubClient.RaiseEvent(instance, options.Signal, options.Parameters[0]);
                }

                if (!options.SkipWorker)
                {
                    try
                    {
                        taskHub.AddTaskOrchestrations(typeof(GreetingsOrchestration), typeof(GreetingsOrchestration2), typeof(CronOrchestration),
                                                            typeof (AverageCalculatorOrchestration), typeof (ErrorHandlingOrchestration), typeof (SignalOrchestration));
                        taskHub.AddTaskOrchestrations(typeof(MigrateOrchestration));

                        taskHub.AddTaskActivities(new GetUserTask(), new SendGreetingTask(), new CronTask(), new ComputeSumTask(), new GoodTask(), new BadTask(), new CleanupTask(),
                                                             new EmailTask());
                        taskHub.AddTaskActivitiesFromInterface<IManagementSqlOrchestrationTasks>(new ManagementSqlOrchestrationTasks());
                        taskHub.AddTaskActivitiesFromInterface<IMigrationTasks>(new MigrationTasks());

                        taskHub.Start();

                        Console.WriteLine("Press any key to quit.");
                        Console.ReadLine();

                        taskHub.Stop(true);
                    }
                    catch (Exception)
                    {
                        // silently eat any unhadled exceptions.
                    }
                }
            }
        }
예제 #8
0
        static void Main(string[] args)
        {
            if (CommandLine.Parser.Default.ParseArgumentsStrict(args, options))
            {
                string servicebusConnectionString = Program.GetSetting("ServiceBusConnectionString");
                string storageConnectionString    = Program.GetSetting("StorageConnectionString");
                string taskHubName = ConfigurationManager.AppSettings["taskHubName"];

                TaskHubClient taskHubClient = new TaskHubClient(taskHubName, servicebusConnectionString, storageConnectionString);
                TaskHubWorker taskHub       = new TaskHubWorker(taskHubName, servicebusConnectionString, storageConnectionString);

                if (options.CreateHub)
                {
                    taskHub.CreateHub();
                }

                if (!string.IsNullOrWhiteSpace(options.StartInstance))
                {
                    string instanceId = options.InstanceId;
                    OrchestrationInstance instance = null;
                    switch (options.StartInstance)
                    {
                    case "Greetings":
                        instance = taskHubClient.CreateOrchestrationInstance(typeof(GreetingsOrchestration), instanceId, null);
                        break;

                    case "Greetings2":
                        if (options.Parameters == null || options.Parameters.Length != 1)
                        {
                            throw new ArgumentException("parameters");
                        }
                        instance = taskHubClient.CreateOrchestrationInstance(typeof(GreetingsOrchestration2), instanceId,
                                                                             int.Parse(options.Parameters[0]));
                        break;

                    case "Cron":
                        // Sample Input: "0 12 * */2 Mon"
                        instance = taskHubClient.CreateOrchestrationInstance(typeof(CronOrchestration), instanceId,
                                                                             (options.Parameters != null && options.Parameters.Length > 0) ? options.Parameters[0] : null);
                        break;

                    case "Average":
                        // Sample Input: "1 50 10"
                        if (options.Parameters == null || options.Parameters.Length != 3)
                        {
                            throw new ArgumentException("parameters");
                        }
                        int[] input = options.Parameters.Select(p => int.Parse(p)).ToArray();
                        instance = taskHubClient.CreateOrchestrationInstance(typeof(AverageCalculatorOrchestration), instanceId, input);
                        break;

                    case "ErrorHandling":
                        instance = taskHubClient.CreateOrchestrationInstance(typeof(ErrorHandlingOrchestration), instanceId, null);
                        break;

                    case "Signal":
                        instance = taskHubClient.CreateOrchestrationInstance(typeof(SignalOrchestration), instanceId, null);
                        break;

                    case "Replat":
                        instance = taskHubClient.CreateOrchestrationInstance(typeof(MigrateOrchestration), instanceId,
                                                                             new MigrateOrchestrationData()
                        {
                            SubscriptionId = "03a1cd39-47ac-4a57-9ff5-a2c2a2a76088", IsDisabled = false
                        });
                        break;

                    default:
                        throw new Exception("Unsupported Orchestration Name: " + options.StartInstance);
                    }

                    Console.WriteLine("Workflow Instance Started: " + instance);
                }
                else if (!string.IsNullOrWhiteSpace(options.Signal))
                {
                    if (string.IsNullOrWhiteSpace(options.InstanceId))
                    {
                        throw new ArgumentException("instantceId");
                    }
                    if (options.Parameters == null || options.Parameters.Length != 1)
                    {
                        throw new ArgumentException("parameters");
                    }
                    string instanceId = options.InstanceId;
                    OrchestrationInstance instance = new OrchestrationInstance {
                        InstanceId = instanceId
                    };
                    taskHubClient.RaiseEvent(instance, options.Signal, options.Parameters[0]);
                }

                if (!options.SkipWorker)
                {
                    try
                    {
                        taskHub.AddTaskOrchestrations(typeof(GreetingsOrchestration), typeof(GreetingsOrchestration2), typeof(CronOrchestration),
                                                      typeof(AverageCalculatorOrchestration), typeof(ErrorHandlingOrchestration), typeof(SignalOrchestration));
                        taskHub.AddTaskOrchestrations(typeof(MigrateOrchestration));

                        taskHub.AddTaskActivities(new GetUserTask(), new SendGreetingTask(), new CronTask(), new ComputeSumTask(), new GoodTask(), new BadTask(), new CleanupTask(),
                                                  new EmailTask());
                        taskHub.AddTaskActivitiesFromInterface <IManagementSqlOrchestrationTasks>(new ManagementSqlOrchestrationTasks());
                        taskHub.AddTaskActivitiesFromInterface <IMigrationTasks>(new MigrationTasks());

                        taskHub.Start();

                        Console.WriteLine("Press any key to quit.");
                        Console.ReadLine();

                        taskHub.Stop(true);
                    }
                    catch (Exception)
                    {
                        // silently eat any unhadled exceptions.
                    }
                }
            }
        }