Questo argomento si applica solo alla configurazione IBM Business Automation Workflow Advanced.

Elaborazione di un flusso di pagine che inizia con un processo BPEL

Alcuni flussi di lavoro vengono eseguiti da una sola persona, ad esempio, ordinando libri da una libreria online. Questo tipo di flusso di lavoro non ha percorsi paralleli. Questo esempio mostra come utilizzare le API initiateAndClaimFirst e completeAndClaimSuccessor per elaborare questo tipo di workflow.

Prima di iniziare

Verificare che il modello del processo che contiene il flusso di pagina soddisfi i seguenti criteri:
  • Poiché l'attività successiva nel flusso di pagina viene reso disponibile nella transazione dell'attività che è stata completata, il comportamento transazionale di tutte le attività human task deve essere impostato su participates.
  • Per garantire che la successiva attività umana nel flusso di pagina possa essere trovata in fase di runtime, non vengono introdotti limiti di transazione tra le attività. Per fare ciò, ad esempio, assicurarsi che tutte le attività di richiamo tra due attività umane abbiano anche il comportamento transazionale impostato su participatese che non utilizzino servizi, come le attività di attesa, che richiedono un limite di transazione.
    Nota: Business Process Choreographer introduce dinamicamente i limiti di transazione non modellati come richiesto, ad esempio come prevenzione di deadlock, che influenzano il funzionamento dell'API completeAndClaimSuccessor . Di solito, l'API rivendica la successiva attività umana nel flusso di pagine, se è disponibile nella transazione dell'attività completata. Tuttavia, se esiste un limite di transazione, la richiesta API viene restituita senza richiedere l'attività successiva.

    Inoltre, dove e come vengono aggiunti i limiti della transazione possono cambiare in futuro, ad esempio dopo l'aggiornamento di un prodotto o dopo l'installazione di una correzione. Pertanto, anche se si modellano i limiti delle transazioni impostando la proprietà di comportamento transazionale sulle attività, l'aderenza a tali limiti non è garantita.

  • Se il flusso di pagina deve essere utilizzato in Business Space, ciascuna delle attività umane nel flusso di pagina deve avere la proprietà personalizzata htm.hasNext impostata su true, tranne l'ultima attività umana nella sequenza. Questa attività deve avere la proprietà personalizzata htm.hasNext impostata su false.

Informazioni su questa attività

Un flusso di pagina viene definito anche flusso di lavoro di una singola persona o flusso di schermo. Esistono due tipi di flussi di pagine:
  • Flussi di pagine lato client, in cui la navigazione tra le diverse pagine è realizzata con una tecnologia lato client, come un modulo Lotus Forms a più pagine.
  • I flussi di pagine lato server vengono realizzati utilizzando un processo BPEL e una serie di attività umane modellati in modo che le successive attività siano assegnate alla stessa persona.
I flussi di pagine lato server sono più potenti dei flussi di pagine lato client, ma consumano più risorse server per elaborarli. Pertanto, considerare l'utilizzo di questo tipo di flusso di lavoro principalmente nelle situazioni riportate di seguito:
  • È necessario richiamare i servizi tra i passi eseguiti in un'interfaccia utente, ad esempio, per richiamare o aggiornare i dati.
  • Si dispone di requisiti di controllo che richiedono la scrittura di eventi CEI una volta completata l'interazione dell'interfaccia utente.
In molte situazioni, l'utilizzo di una combinazione di flussi di pagine lato server e lato client è appropriato. Questo esempio mostra un flusso di pagine lato server.

Un esempio tipico di un flusso di pagine è il processo di ordinazione in una libreria online, in cui l'acquirente completa una sequenza di azioni per ordinare un libro. Questa sequenza di azioni può essere implementata come una serie di attività dell'attività umana (attività da eseguire). Se l'acquirente decide di ordinare diversi libri, ciò equivale ad avviare un processo di ordine e a richiedere la successiva attività umana.

L'API initiateAndClaimFirst avvia il flusso di pagina, ossia il processo specificato e richiede la prima attività umana nella sequenza di attività. Restituisce le informazioni sull'attività richiesta, incluso il messaggio di input su cui lavorare.

L'API completeAndClaimSuccessor completa quindi l'attività human task e ne richiede la successiva nella stessa istanza del processo per la persona collegata. L'API restituisce le informazioni sulla successiva attività richiesta, incluso il messaggio di input su cui lavorare.

Confrontare questo esempio con l'esempio di un flusso di pagine avviato da un'attività to-do.

Procedura

  1. Avviare il processo di ordinazione del libro e richiedere la prima attività nella sequenza di attività.
    Avviare il processo con un messaggio di input del tipo appropriato. Quando si crea il messaggio, è necessario specificare il nome del tipo di messaggio in modo che la definizione del messaggio sia contenuta. Se si specifica un nome di istanza del processo, non deve iniziare con un carattere di sottolineatura. Se non si specifica un nome dell'istanza del processo, come nome viene utilizzato l'ID dell'istanza del processo (PIID) in formato stringa.
    1. Richiamare il modello di processo per creare un messaggio di input del tipo appropriato.
      ProcessTemplateData template = process.getProcessTemplate("CustomerOrder");
      ClientObjectWrapper input = process.createMessage(template.getID(),
                                  template.getInputMessageTypeName());
      DataObject myMessage = null;
      if ( input.getObject()!= null && input.getObject() instanceof DataObject )
      {
        myMessage = (DataObject)input.getObject();
        //set the strings in the message, for example, a customer name
        myMessage.setString("CustomerName", "Smith");
      }
    2. Avviare il processo e richiedere la prima attività umana.
      InitiateAndClaimFirstResult result = 
        process.initiateAndClaimFirst("CustomerOrder", "MyOrderProcess", input);
      AIID aiid = result.getAIID(); 
      ClientObjectWrapper input = result.getInputMessage();
    Quando la prima attività viene richiesta, vengono restituiti il messaggio di input e l'ID dell'attività richiesta.
  2. Quando il lavoro sull'attività è terminato, completare l'attività e richiedere l'attività successiva.

    Per completare l'attività, viene trasmesso un messaggio di output. Quando si crea il messaggio di output, è necessario specificare il nome del tipo di messaggio in modo che la definizione del messaggio sia contenuta.

    ActivityInstanceData activity = process.getActivityInstance(aiid);
    ClientObjectWrapper output = 
          process.createMessage(aiid, activity.getOutputMessageTypeName());
    DataObject myMessage = null ;
    if ( output.getObject()!= null && output.getObject() instanceof DataObject )
    {
      myMessage = (DataObject)output.getObject();
      //set the parts in your message, for example, an order number
      myMessage.setInt("OrderNo", 4711);
    }
    
    //complete the activity and claim the next one
    CompleteAndClaimSuccessorResult successor = 
       process.completeAndClaimSuccessor(aiid, output);
    Questa azione imposta un messaggio di output che contiene il numero di ordine e rivendica l'attività successiva nella sequenza. Se AutoClaim è impostato per le attività successore e se è possibile seguire più percorsi, vengono richieste tutte le attività successore e viene restituita un'attività casuale come attività successiva. Se non ci sono altre attività successore che possono essere assegnate a questo utente, viene restituito Null .

    Se il processo contiene percorsi paralleli che possono essere seguiti e questi percorsi contengono attività umane per cui l'utente collegato è un potenziale proprietario di più di una di queste attività, un'attività casuale viene richiamata automaticamente e restituita come attività successiva.

  3. Gestire l'attività successiva.
    String name = successor.getActivityName();
    
    ClientObjectWrapper nextInput = successor.getInputMessage();
    if ( nextInput.getObject()!= 
                   null && nextInput.getObject() instanceof DataObject )
    {
      activityInput = (DataObject)input.getObject();
      // read the values
      ...
    }  
    
    aiid = successor.getAIID();
  4. Continuare con il passo 2 per completare l'attività.