Beispiel #1
0
        private async Task <DecisionTask> PollAmazonSwfForDecisionTaskAsync(TaskList taskList, string pollingIdentity, CancellationToken token, string nextPageToken)
        {
            var request  = taskList.DecisionTaskPollingRequest(_name, pollingIdentity, nextPageToken);
            var response = await _simpleWorkflowClient.PollForDecisionTaskAsync(request, token);

            return(response?.DecisionTask);
        }
        /// <summary>
        /// Retrieves the next page of history from
        /// </summary>
        /// <returns>The next page of history events.</returns>
        private List <HistoryEvent> GetNextPage()
        {
            var request = new PollForDecisionTaskRequest {
                Domain          = _request.Domain,
                NextPageToken   = _lastResponse.NextPageToken,
                TaskList        = _request.TaskList,
                MaximumPageSize = _request.MaximumPageSize
            };

            const int retryCount = 10;
            int       currentTry = 1;
            bool      pollFailed;

            do
            {
                pollFailed = false;

                try
                {
                    _lastResponse = _swfClient.PollForDecisionTaskAsync(request).Result.DecisionTask;
                }
                catch (Exception ex)
                {
                    Console.Error.WriteLine("Poll request failed with exception: " + ex);
                    pollFailed = true;
                }

                currentTry += 1;
            } while (pollFailed && currentTry <= retryCount);

            return(_lastResponse.Events);
        }
 private async Task <PollForDecisionTaskResponse> PollForDecisionTaskAsync(string domain, string taskList, string workerId, string nextPageToken = null)
 {
     return(await _workflow.PollForDecisionTaskAsync(new PollForDecisionTaskRequest
     {
         Domain = domain,
         Identity = workerId,
         TaskList = new TaskList
         {
             Name = taskList
         },
         NextPageToken = nextPageToken
     }));
 }
Beispiel #4
0
        DecisionTask Poll()
        {
            Logger.LogMessage("Polling for Decision task ...");
            PollForDecisionTaskRequest request = new PollForDecisionTaskRequest()
            {
                Domain   = Constants.SWF_DOMAIN,
                TaskList = new TaskList()
                {
                    Name = Constants.SWF_DECIDER_TASKLIST
                }
            };
            PollForDecisionTaskResponse response = _swfClient.PollForDecisionTaskAsync(request).Result;

            return(response.DecisionTask);
        }
        async IAsyncEnumerable <PollForDecisionTaskResponse> IPaginator <PollForDecisionTaskResponse> .PaginateAsync(CancellationToken cancellationToken = default)
        {
            if (Interlocked.Exchange(ref _isPaginatorInUse, 1) != 0)
            {
                throw new System.InvalidOperationException("Paginator has already been consumed and cannot be reused. Please create a new instance.");
            }
            var nextPageToken = _request.NextPageToken;
            PollForDecisionTaskResponse response;

            do
            {
                _request.NextPageToken = nextPageToken;
                response = await _client.PollForDecisionTaskAsync(_request, cancellationToken).ConfigureAwait(false);

                nextPageToken = response.DecisionTask.NextPageToken;
                cancellationToken.ThrowIfCancellationRequested();
                yield return(response);
            }while (nextPageToken != null);
        }
Beispiel #6
0
        /// <summary>
        /// Polls for descision tasks and decides what decisions to make.
        /// </summary>
        internal void PollAndDecide()
        {
            Debug.Assert(_workflow != null);

            while (!_cancellationToken.IsCancellationRequested)
            {
                var taskTolken = "";
                try
                {
                    var decisionTaskRequest = new PollForDecisionTaskRequest
                    {
                        Domain = _workflow.Options.Domain,
                        //Identity = _workflow.WorkflowId,
                        TaskList = _workflow.TaskList                         // This could be a specific TaskList instead of default value from context.
                    };

                    Logger.Debug("TaskList: {0}", _workflow.TaskList.Name);

                    PollForDecisionTaskResponse decisionTaskResponse = _swfClient.PollForDecisionTaskAsync(decisionTaskRequest).Result;
                    DecisionTask decisionTask = decisionTaskResponse.DecisionTask;

                    taskTolken = decisionTask.TaskToken;

                    if (!string.IsNullOrEmpty(decisionTask.TaskToken))
                    {
                        Logger.Debug("Get Decision.");

                        // Define a new WorkflowEventsProcessor object and let it make the decision!
                        var workflowProcessor = new WorkflowEventsProcessor(decisionTask, _workflow, decisionTaskRequest, _swfClient, _storageClient);
                        var decisionRequest   = workflowProcessor.Decide();

                        //var decisionRequest = _workflow.Decide(decisionTask, decisionTaskRequest);

                        Logger.Debug("RespondDecisionTaskCompleted.");

                        // We have our decision, send it away and do something more productive with the response
                        _swfClient.RespondDecisionTaskCompletedAsync(decisionRequest).Wait();
                    }

                    //Sleep to avoid aggressive polling
                    Thread.Sleep(200);
                }

                /*catch (AmazonSimpleWorkflowException ex)
                 * {
                 *      Logger.Error(ex, "");
                 *
                 *      //if (_workflow != null)
                 *      //	_workflow.StopWorkers();
                 *
                 *      //if (!string.IsNullOrEmpty(taskTolken))
                 *      //{
                 *      //	var respond = _workflow.FailWorkflowRespond(ex.Message, "");
                 *      //	respond.TaskToken = taskTolken;
                 *      //	try
                 *      //	{
                 *      //		// Just try to stop workflow.
                 *      //		_swfClient.RespondDecisionTaskCompleted(respond);
                 *      //	}
                 *      //	catch
                 *      //	{
                 *      //	}
                 *      //}
                 *      //Console.WriteLine("Caught Exception: " + ex.Message);
                 *      //Console.WriteLine("Response Status Code: " + ex.StatusCode);
                 *      //Console.WriteLine("Error Code: " + ex.ErrorCode);
                 *      //Console.WriteLine("Error Type: " + ex.ErrorType);
                 *      //Console.WriteLine("Request ID: " + ex.RequestId);
                 *      //Console.WriteLine("Data: " + ex.Data);
                 *      //Console.WriteLine("Stacktrace: " + ex.StackTrace);
                 * }*/
                catch (Exception e)
                {
                    Logger.Error(e, "");

                    //if (_workflow != null)
                    //	_workflow.StopWorkers();

                    //if (!string.IsNullOrEmpty(taskTolken))
                    //{
                    //	var respond = _workflow.FailWorkflowRespond(e.Message, "");
                    //	respond.TaskToken = taskTolken;
                    //	try
                    //	{
                    //		// Just try to stop workflow.
                    //		_swfClient.RespondDecisionTaskCompleted(respond);
                    //	}
                    //	catch
                    //	{
                    //	}
                    //}
                }
            }

            Logger.Info("Exit from Workflow Worker.");
        }