Question

Accessing Out Arguments with WorkflowApplication when wf wait for response(bookmark OR idle) and not complete

Was it helpful?

Solution 2

Even simpler: Use another workflow activity to store the value you are looking for somewhere (database, file, ...) before starting to wait for a response!

OTHER TIPS

I also used Tracking to retrieve the values, but instead of saving it to a database I come up with the following solution.
Make a Trackingparticipant and collect the data from an activity. You can fine tune the tracking participant profile with a spefic tracking query. I have added a public property Output to set the value of the data from the record.

public class CustomTrackingParticipant : TrackingParticipant
{
        //TODO: Fine tune the profile with the correct query.
        public IDictionary<String, object> Outputs { get; set; }
        protected override void Track(TrackingRecord record, TimeSpan timeout)
        {
            if (record != null)
            {
                if (record is CustomTrackingRecord)
                {
                    var customTrackingRecord = record as CustomTrackingRecord;
                    Outputs = customTrackingRecord.Data;
                }
            }
        }
    }

In your custom activity you can set the values you want to expose for tracking with a CustomTrackingRecord. Here is a sample to give you an idea.

protected override void Execute(NativeActivityContext context)
{
    var customRecord = new CustomTrackingRecord("QuestionActivityRecord");
    customRecord.Data.Add("Question", Question.Get(context));
    customRecord.Data.Add("Answers", Answers.Get(context).ToList());
    context.Track(customRecord);
    //This will create a bookmark with the display name and the workflow will go idle.
    context.CreateBookmark(DisplayName, Callback, BookmarkOptions.None);
}

On the WorklfowApplication instance you can add the Tracking participant to the extensions.

workflowApplication.Extensions.Add(new CustomTrackingParticipant());

On the persistable idle event from the workflowApplication instance I subscribed with the following method. In the method I get the tracking participant from the extensions. Because we have set the outputs in the public property we can access them and set them in a member outside the workflow. See the following example.

private PersistableIdleAction PersistableIdle(WorkflowApplicationIdleEventArgs 
workflowApplicationIdleEventArgs)
{
    var ex = workflowApplicationIdleEventArgs.GetInstanceExtensions<CustomTrackingParticipant>();
    Outputs = ex.First().Outputs;
    return PersistableIdleAction.Unload;
}

I hope this example helped.

You could use Tracking.

required steps would be:

  • define a tracking profile which queries ActivityStates with the state closed
  • Implement an TrackingParticipant to save the OutArgument in process memory, a database or a file on disk
  • hook everything together

The link cotains all the information you will need to do this.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top