in

DotNetSide

Dot Net South Italy Developers User Group

Latest post 06 Oct 2006 19:28 by GBFoundation. 6 replies.
Page 1 of 1 (7 items)
Sort Posts: Previous Next
  • 04 Oct 2006 12:32

    Workflow ParallelActivity

    A seguito di alcune domande ricevute sulla ParallelActivity, ieri ho deciso di farne un post (http://www.dotnetside.org/blogs/mighell/archive/2006/10/03/Workflow-ParallelActivity_3A00_-un-po_2700_-di-chiarezza.aspx) da cui però si stà sviluppando una interessante discussione. A questo punto, la cosa più sensata è discuterne sul forum Wink.

    Quoto di seguito la domanda fatta come commento al post:

    ...si adesso è molto più chiaro(grazie), anche se in questo caso(windows workflow foundation) pensavo che a differenza di altri workflow il termine era stato in qualche modo esteso con i concetti di multi-threads(quindi dei rami eseguiti in modo simultaneo.....presumo che anche nel caso di workflow di tipo stato non è possibile avere step paralleli e contemporanei)...due domande, hai usato il termine "bloccante" tra virgolette perchè se fosse veramente bloccante, il flusso parallelo non si concluderebbe, quindi cosa importante è che i rami alla fine devono essere tutti eseguiti...dico bene?...seconda domanda, come dicevo nell'email se uno volesse eseguire uno o più rami in modo simultaneo dovrebbe richiamare senza l'uso del parallel activity dei sottoflow tramite l'uso dell'activity "InvokeWorkflow"? oppure no :)?

    -Pierluca

    Dunque...

    due domande, hai usato il termine "bloccante" tra virgolette perchè se fosse veramente bloccante, il flusso parallelo non si concluderebbe, quindi cosa importante è che i rami alla fine devono essere tutti eseguiti...dico bene?

    Dici bene. Il Workflow sequenziale, a differenza di una macchina a stati, dovrebbe sempre conlcudersi (altrimenti che sequenziale sarebbe)? Può durare a lungo (long running workflow) ma deve finire. Pensa ad un processo di approvazione di una nota spese: magari può durare a lungo (il manager è assente) ma qualcuno dovrà pur approvare. E se nessuno approva, il workflow si conclude ugualmente.
    Stesso discroso vare per le activity ed in particolare per la parallel. Se guardi il disegno, tutti i rami della parallel convergono in un punto che identifica "l'uscita" dalla composite activity. Il vantaggio di una parallel è che un ramo temporaneamente bloccante (forse è il termine più adeguato), non blocca l'esecuzione di tutti gli altri rami. Ma si esce dalla parallel activity solo quando tutti i rami hanno completato l'esecuzione (anche con una eccezione ovviamente gestita Wink).

    seconda domanda, come dicevo nell'email se uno volesse eseguire uno o più rami in modo simultaneo dovrebbe richiamare senza l'uso del parallel activity dei sottoflow tramite l'uso dell'activity "InvokeWorkflow"? oppure no :)?

    Potresti, ma ti serve davvero? Ogni WF verrebbe eseguito in un thread separato ma poi ti tocca sincronizzarli (i risultati dei workflow richiamati in ogni ramo). Ti serve davvero una cosa del genere?

    Filed under:
    • Post Points: 20
  • 04 Oct 2006 15:23 In reply to

    Re: Workflow ParallelActivity

    Mighell:

    ......Stesso discroso vare per le activity ed in particolare per la parallel. Se guardi il disegno, tutti i rami della parallel convergono in un punto che identifica "l'uscita" dalla composite activity. Il vantaggio di una parallel è che un ramo temporaneamente bloccante (forse è il termine più adeguato), non blocca l'esecuzione di tutti gli altri rami. Ma si esce dalla parallel activity solo quando tutti i rami hanno completato l'esecuzione (anche con una eccezione ovviamente gestita Wink).

    ...anche se in alcuni si possono avere delle esigenze di parallelismo ben diverse, in cui questo activity può fare ben poco(ora non sò se c'è qualche activity più adatto, o se è opportuno usare invece workflow di tipo state machine, o ancora meglio farsi un bel activity custom)....nel senso che si potrebbe avere l'esigenza di dover una volta eseguito un certo ramo uscire dal parallelismo senza aspettare che gli altri terminano....che sò supponiamo di dovere analizzare tre diverse directory su tre server diversi, che sò tramite tre diversi web service....cosa importante che il primo che trova un certo file(la butto lì) determina la fine del parallelismo...è necessario avere un parallelismo perchè l'operazione in questo modo è ottimale dal punto di vista della tempistica...non sò se sono stato chiaro, ma soprattuto se l'esempio è calzante al 100% Confused

     Per la seconda domanda......bhè si, è importante nel mio caso avere un parallelismo simultaneo....secondo te mi conviene avere un code activity sul workflow di base che richiama i due workflow oppure in questo caso avrebbe senso avere un parallel costituito da due rami nei quali tramite due activity invoke workflow richiamo i rispettivamente workflow?

    http://addshare.blogspot.com/ Imparo, Imparo, Imparo

    • Post Points: 20
  • 04 Oct 2006 18:22 In reply to

    Re: Workflow ParallelActivity

    GBFoundation:

    Mighell:

    ......Stesso discroso vare per le activity ed in particolare per la parallel. Se guardi il disegno, tutti i rami della parallel convergono in un punto che identifica "l'uscita" dalla composite activity. Il vantaggio di una parallel è che un ramo temporaneamente bloccante (forse è il termine più adeguato), non blocca l'esecuzione di tutti gli altri rami. Ma si esce dalla parallel activity solo quando tutti i rami hanno completato l'esecuzione (anche con una eccezione ovviamente gestita Wink).

    ...anche se in alcuni si possono avere delle esigenze di parallelismo ben diverse, in cui questo activity può fare ben poco(ora non sò se c'è qualche activity più adatto, o se è opportuno usare invece workflow di tipo state machine, o ancora meglio farsi un bel activity custom)....nel senso che si potrebbe avere l'esigenza di dover una volta eseguito un certo ramo uscire dal parallelismo senza aspettare che gli altri terminano....che sò supponiamo di dovere analizzare tre diverse directory su tre server diversi, che sò tramite tre diversi web service....cosa importante che il primo che trova un certo file(la butto lì) determina la fine del parallelismo...è necessario avere un parallelismo perchè l'operazione in questo modo è ottimale dal punto di vista della tempistica...non sò se sono stato chiaro, ma soprattuto se l'esempio è calzante al 100% Confused

     

    L'ideale sarebbe avere una custom activity che gestisca un reale parallelismo.

    GBFoundation:

    Per la seconda domanda......bhè si, è importante nel mio caso avere un parallelismo simultaneo....secondo te mi conviene avere un code activity sul workflow di base che richiama i due workflow oppure in questo caso avrebbe senso avere un parallel costituito da due rami nei quali tramite due activity invoke workflow richiamo i rispettivamente workflow?

    La seconda che hai detto Big Smile ma devi tenere sempre d'occhio il problema della sincronizzazione.
    Appena ho un attimo (cosa rara in questo periodo con il workshop in vista), voglio fare qualche prova più concreta Wink.

    Ciao

    PS: bella discussione Smile

    • Post Points: 35
  • 05 Oct 2006 23:39 In reply to

    Re: Workflow ParallelActivity

    ...qualche prova l'ho fatta(nel poco tempo :( )...diciamo che come tempi mi sarei aspettato una riduzione sensibile(ma questo aspetto voglio approfondirlo meglio Geeked)...ci sono due aspetti un pò ostici in un parallelismo simultaneo(che ho personalmente notato) ....
    1)quando dall'ambiente di host viene scatenato un evento su uno dei sub flow per mezzo dell'activity HandleExternalEvent...per passare il giusto guid dell'instanza mi son fatto un metodo che richiamo nell'host...tipo questo:

    Guid idInstanceWorkflow = Guid.Empty;
            foreach (WorkflowInstance instanceFlow in workflowEngine.GetLoadedWorkflows())
            {
              if (instanceFlow != null)
              {
                if (instanceFlow.GetWorkflowDefinition().Name == "Workflow2")
                {
                  idInstanceWorkflow = instanceFlow.InstanceId;
                  break;
                }
              }

    ...scusate la mancanza di commenti ma visto l'ora me lo concedo....si tratta di un ciclo sulle instanze di workflow finchè non trovo quella che mi interessa recuperando così il guid che lo indentifica...

    2)sincronizzare il flow contenitore.... nel senso che prima di procedere è necessario aspettare che i due o più sub flow siano terminati...in questo caso nell'evento WorkflowCompleted del flow contenitore aspetto che i sub flow siano terminati entrambi(con un semplice contatore), a tal punto scatta un evento dall'ambiente di host al flow contenitore...potevo anche mettere un'activity di tipo while sul flow contenitore, ciclando finchè i due sub flow non settano delle property, ma mi sembrava più elegante la prima soluzione :P

    http://addshare.blogspot.com/ Imparo, Imparo, Imparo

    • Post Points: 20
  • 06 Oct 2006 1:03 In reply to

    Re: Workflow ParallelActivity

    Allora....oggi ne discutevo con William sul messenger e la cosa sembra essere decisamente complessa. Alla base c'è un ragionamento (grazie Wil per il chiarimento) relativo allo scheduler. In sostanza, guardando come è ralizzato il runtime, il responsabile dell'esecuzione del workflow è lo scheduler. Demandare la gestione dei thread alle activity potrebbe essere controproducente (ammesso che si riesca a fare al 100%).
    Ma allora come fare a realizzare un reale parallelismo? Dunque....la strada dell'invoke workflow potrebbe essere una. In effetti, come mi faceva notare Wil stamattina, l'invoke workflow non fa altro che richiamare il metodo StartWorkflow e poi uscire (codice tratto da reflector):

          ....
          Guid guid1 = workflow1.StartWorkflow(this.TargetWorkflow, dictionary1);
          if (guid1 == Guid.Empty)
          {
                throw new InvalidOperationException(SR.GetString("Error_FailedToStartTheWorkflow"));
          }
          this.SetInstanceId(guid1);
          return ActivityExecutionStatus.Closed;
    }

    In effetti, come puoi facilmente accorgerti facendo qualche test, una volta invocato il workflow "annidato" (eseguito in un thread diverso), l'activity si conclude ed il workflow ospite viene eseguito.
    Per fare un parallelismo, dovresti:

    1. creare la parallel activity
    2. in ogni ramo usare l'invoke workflow
    3. sospendere il workflow "padre" in ogni ramo in attesa che i workflow child vengano eseguiti
    4. gestire la fine dell'esecuzione dei workflow "figli" (e qui potrebbero nascere problemi con le eccezioni, esecuzioni lunghe, tracking, eventuale persistenza etc)
    5. in ogni ramo, continuare l'esecuzione quando i wf child hanno finito

    Tale metodologia, su 2 piedi (e a quest'ora Stick out tongue) non mi sembra riutilizzabile. Ti toccherebbe rifartela ogni volta che hai l'esigenza.
    L'altra strada, quella architetturalmente più elegante, sarebbe quella di creare una custom activity ma ci si scontra sempre con il vincolo che le activity non dovrebbero governare i thread.
    Insomma....se non s'è capito, la cosa non è delle più semplici Stick out tongue e bisogna capire se davvero ne vale la pena.
    WF è davvero un ottimo strumento ma immagino che in determinati scenari, l'uso di BizTalk sia ancora da preferire.

    Comunque ci ragioniamo....perchè il problema è stimolante.

    Per curiosità, potresti postare lo schema del tuo wf in modo da capire come è strutturato? (sempre se non è un problema).

    In ultimo, da uno sguardo qui: http://blogs.msdn.com/advancedworkflow/archive/2006/02/23/538160.aspx Da qualche spiegazione in più circa la parallel ed il threading.
    Il succo è: a prescindere dal fatto che si possa fare o meno, ha davvero senso farlo?

     

    • Post Points: 5
  • 06 Oct 2006 10:13 In reply to

    Re: Workflow ParallelActivity

    ...uhm rileggendo quello che ho scritto ieri sera mi rendo conto di non essere stato chiarissimo....ho preparato uno schema(disegno) che rissume più o meno il flow(quello definitivo vedrò di postarlo questa sera)..

    http://img134.imageshack.us/my.php?image=flowbasenb6.jpg

    ....l'ultimo activity è di tipo HandleExternal Event scatenato dall'ambiente di host quando tutti e due i sub flow che invoco nel ParallelActivity terminano. Sapere quando terminano è semplice, basta mettersi sull'evento complete del workflow di base....

    ..il punto uno invece del precedente post si riferiva al fatto che nei sub flow ci sono delle activity di tipo  HandleExternal Event. Quindi l'ambiente di host deve passare all'evento il guid che identifica il sub workflow interessato. Per fare ciò ho fatto quel metodo semplice che ho postato ieri proprio per recuperare l'id dell'istanza del sub flow.....spero di essere stato più chiaro questa volta :P

    http://addshare.blogspot.com/ Imparo, Imparo, Imparo

    • Post Points: 5
  • 06 Oct 2006 19:28 In reply to

    Re: Workflow ParallelActivity

    ...questo è il flow complessivo ripulito delle activity che compongono i sub flow:

    Flow Complessivo

    http://addshare.blogspot.com/ Imparo, Imparo, Imparo

    • Post Points: 5
Page 1 of 1 (7 items)
Powered by Community Server (Commercial Edition), by Telligent Systems