2

Ich versuche, eine StateMachine einige Datenbankaktion zwischen Status auszuführen.Verwenden von CallExternalMethodActivity/HandleExternalEventActivity in StateMachine

So habe ich einen "Start" -Zustand, der CallExternalMethodActivity verwendet, um eine "BeginExecuteNonQuery" -Funktion für eine mit ExternalDataExchangeAttribute dekorierte Klasse aufzurufen. Danach verwendet es eine SetStateActivity, um in einen "Ending" -Zustand zu wechseln.

Der Zustand "ending" verwendet eine HandleExternalEventActivity, um ein "EndExecuteNonQuery" -Ereignis abzurufen.

Ich kann durch den lokalen Dienst in die "BeginExecuteNonQuery" -Funktion gehen.

Das Problem ist, dass die "EndExecuteNonQuery" null ist.

public class FailoverWorkflowController : IFailoverWorkflowController 
{ 
    private readonly WorkflowRuntime workflowRuntime; 

    private readonly FailoverWorkflowControlService failoverWorkflowControlService; 
    private readonly DatabaseControlService databaseControlService; 

    public FailoverWorkflowController() 
    { 
     workflowRuntime = new WorkflowRuntime(); 
     workflowRuntime.WorkflowCompleted += workflowRuntime_WorkflowCompleted; 
     workflowRuntime.WorkflowTerminated += workflowRuntime_WorkflowTerminated; 

     ExternalDataExchangeService dataExchangeService = new ExternalDataExchangeService(); 
     workflowRuntime.AddService(dataExchangeService); 

     databaseControlService = new DatabaseControlService(); 
     workflowRuntime.AddService(databaseControlService); 

     workflowRuntime.StartRuntime(); 
    } 

    ... 
} 

...

public void BeginExecuteNonQuery(string command) 
{ 
    Guid workflowInstanceID = WorkflowEnvironment.WorkflowInstanceId; 

    ThreadPool.QueueUserWorkItem(delegate(object state) 
            { 
             try 
             { 
              int result = ExecuteNonQuery((string)state); 
              EndExecuteNonQuery(null, new ExecuteNonQueryResultEventArgs(workflowInstanceID, result)); 
             } 
             catch (Exception exception) 
             { 
              EndExecuteNonQuery(null, new ExecuteNonQueryResultEventArgs(workflowInstanceID, exception)); 
             } 
            }, command); 
} 

Was bin ich mit meiner Implementierung falsch?

-stan

Antwort

1

Ich kann nicht aus dem Code-Schnipsel sagen, aber stellen Sie sicher, dass Sie die ExternalDataExchangeService verwenden, um Ihren Dienst zu hosten und fügen Sie nicht direkt zum Runtime Service. Der ExternalDataExchangeService ist dafür verantwortlich, die erforderlichen Eventhandler hinzuzufügen und die Ereignisse in Warteschlangennachrichten für den Workflow umzuwandeln.

+0

ich die ExternalDataExchangeService bin mit ... Ich werde mehr Code schreiben für Sie zu sehen ... –

+0

Und Sie haben Recht. .. Ich verwende nicht den ExternalDataExchangeService ... Lass mich versuchen und sehen, wie es geht ... –

+0

Yup ... Sie hatten Recht .. –

0

Ich verwende ExternalDataExchangeService ohne Code durch meine Config-Datei, wie gezeigt here Wechsel: