First Previous Next Last ワークフローガイド  

第4章    アクティビティおよびリンクのカスタマイズ

この章では、自動アクティビティのJavaクラスを作成する方法と、アクティビティおよびリンクのランタイム動作をカスタマイズする方法について説明します。 この章は、次の節から構成されています。

 
Top of page

自動アクティビティの作成

自動アクティビティは、プロセス内での不在タスク/ステップを表します。 ワークフローデザイナでは、自動アクティビティノードを作成し、このタスクのエンジンとキューを設定するプロパティを指定できます。 詳細については、 同期化マージアクティビティを参照してください。

アクティビティの論理を実行するJavaクラスを生成するには、Activityウィザードを使用します。 生成された自動アクティビティクラスは、ランタイム時にのみ使用されます。 設計時クラスは生成されません。

Procedure カスタムアクティビティのJavaクラスを生成する

  1. WorkbenchでEARプロジェクトが開いている状態で、[File]>[New]の順に選択します。

  2. Workflow]タブをクリックします。

    wdAutoActivity

  3. Workflow Activity]を選択して、[OK]をクリックします。

  4. ウィザードパネルを完了します。

    パネル項目

    説明

    Class name

    Javaクラスファイルの名前。 これは、ワークフローデザイナのAutomatic Activityプロパティシートで参照される名前です。

    Package

    (オプション)クラスのパッケージ名。

    Resource Set

    ランタイム配備クラスを保存するためのリソースセット。

    Include loggingcode

    生成されたテンプレートにログ出力コードを含めます。

    AutomaticActivity

    自動アクティビティのコードを生成する場合に選択します。 カスタムアクティビティのコードを生成する場合は、選択を解除します。

  5. [Finish]をクリックします。

    ウィザードによって、自動アクティビティスタブクラスが生成されます。

 
Top of section

自動アクティビティのコード化

生成されたクラスは、EbiActivityインタフェースを実装します。 このインタフェースは、ワークフローデザイナでアクティビティプロパティを編集する場合に選択する自動アクティビティクラスをワークフローデザイナで検出する方法です。

ウィザードでは、次の4つのメソッドスタブを生成します。

  public void invoke()
  public void timeout(int retries)
  public void restart()
  public void terminate()

invoke()

このメソッドは、自動アクティビティのワークフローキューで作業が表示される場合に呼び出されます。 キューから作業を要求することは、自動アクティビティの責任です。 これは、キュー委任インタフェースを使用して実行されます。 ワークアイテムは、変更する前にロックされている必要があります。 すべての変更を行ったら、次のアクティビティに作業を転送します。

For more information    詳細については、『APIリファレンス』のEbiQueueDelegateおよびEbiWorkitem Delegateを参照してください。

invoke()メソッドは、次のように表示されます。

  public void invoke(){   
   try
     {
     //Get the queue delegate for requesting work
     EbiQueueDelegate queueDelegate = EboFactory.getQueueDelegate();
     
     //Get the next workitem 
     EbiWorkitemDelegate workitemDelegate =
        queueDelegate.getNextWorkitem(this.getClass().getName());
     
     //lock workitem
     workitemDelegate.lockDocument("Document1",
        this.getClass().getName());
    
     //Do the logic for the activity, for example..
     EbiProperty prop = (EbiProperty) new EboProperty("Document1",
        "DocProp1", "Hello world!", EbiProperty.TYPE_STRING, false);
     workitemDelegate.setDocumentProperty(prop, this.getClass().getName());
     
     //Forward to next workitem -- this automatically unlocks it
     queueDelegate.forward(workitemDelegate2);
    }
   catch (Exception e)
    {
     e.printStackTrace();
    }
  }

restart()

このメソッドは、作業を実行するためのアクションを再開するよう、自動アクティビティに通知します。 通常、これは、invokeメソッドで行われるものと同じアクションになりますが、追加のアクションが含まれる場合もあります。

timeout()

このメソッドは、タイムアウトが発生したことを自動アクティビティに通知し、int引数は、再試行の回数(タイムアウトの後でアクティビティがアクティブな状態を保つことのできる回数)を表します。 カウントがゼロの場合、自動アクティビティでは、この偶発性に対して開発者が指示したアクションを実行します。 この時点では、ワークフローシステムによって強制される特定のアクションはありません。

terminate()

このメソッドは、この偶発性に対して開発者が指示した適切なアクションに従うよう、自動アクティビティに通知します。 restart()メソッドの場合と同様に、ワークフローサブシステムでは、特定のアクションを強制しません。

 
Top of page

アクティビティのランタイム動作のカスタマイズ

カスタムアクティビティでは、作業を実行させるためにワークアイテムがワークフローキューに送信される前に、カスタマイズしたランタイム動作を追加できます。また、作業が実行された後でも、カスタマイズした動作を追加できます。 onPreprocess()およびonPostprocess()という2つのメソッドは、それぞれワークアイテム処理前と処理後を表しています。

カスタムアクティビティのクラステンプレートを作成するには、Custom Activityウィザード( カスタムアクティビティのJavaクラスを生成するの説明を参照)を使用します。 生成されたクラスは、EboProcessNodeを拡張します(次を参照)。

  import com.sssw.wf.activity.*;
  import com.sssw.wf.api.*;
  import com.sssw.wf.message.EbiDispatch;
  import com.sssw.wf.exception.*;
  import com.sssw.wf.core.*;
  import com.sssw.wf.client.EboFactory;
  import com.sssw.wf.client.EbiQueueDelegate;
  import com.sssw.wf.client.EbiWorkitemDelegate;
  import org.w3c.dom.*;
  
  /**
      This class is a sample runtime activity.
  */
  public class UntitledActivity1 extends EboProcessNode {
  
      public UntitledActivity1() {
      }
  }

 
Top of section

アクティビティのコード化

カスタムポストプロセスアクションの形式を示す例は、次のとおりです。

  /**
  This class is a sample runtime activity.
  */
  public class UntitledActivity1 extends EboProcessNode {
  
    public UntitledActivity1() {
    }
    public void onPostprocess (EbiDispatch dispatch) throws  
         EboActivityException
    {
      EbiWorkitem wi = dispatch.getMessage().getWorkitem();
      //Logic goes here
       }
  }

dispatch引数は、getMessage()呼び出しを使用して、ワークアイテムに対して照会できます。 その後、ワークアイテムは、EbiWorkitemDelegateから、プロパティまたはドキュメント、あるいはその両方に対して照会できます。

同様に、ワークフローキューにワークアイテムが送信される前にカスタムアクションのカスタムアクティビティで使用可能なメソッドは、次のとおりです。

  public void OnPreprocess (EbiDispatch dispatch) throws EboActivityException

使用方法は、前に説明したOnPostprocess()メソッドの場合と同じです。

 
Top of page

リンクのランタイム動作のカスタマイズ

カスタムリンクは、リンクパスのセットが選択される方法を完全に制御します。 カスタムリンクのクラステンプレートを作成するには、リンクウィザード(次を参照)を使用します。 生成されたクラスは、EbiLinkを実装します。 カスタムリンクコードでは、EbiLink.getDestinations()を実装することによって、ワークアイテムリンクプロパティにアクセスできます。

Procedure カスタムリンクのJavaクラスを生成する

  1. WorkbenchでEARプロジェクトが開いている状態で、[File]>[New]の順に選択します。

  2. Workflow]タブをクリックします。

    wdCustomLink

  3. Workflow Link]を選択して、[OK]をクリックします。

  4. パネル項目

    説明

    Class name

    Javaクラスファイルの名前

    Package

    (オプション)クラスのパッケージ名

    Resource Set

    ランタイム配備クラスを保存するためのリソースセット

    Include logging code

    生成されたテンプレートにログ出力コードを含める

    ウィザードパネルを完了します。

    結果のコードテンプレートは、次のようになります。

      import java.util.List;
      import com.sssw.wf.core.EbiWorkitem;
      import com.sssw.wf.api.EbiLink;
      import com.sssw.wf.exception.EboLinkException;
      
      /**
       *   UntitledLink1
      */
      public class UntitledLink1 implements EbiLink {
      
          public UntitledLink1() {
          }
      
          public List getDestinations(EbiWorkitem workitem) throws
              EboLinkException {
          // This method should return a List of objects of type EbiDestination
              return null;
          }
      }
    

 
Top of section

リンクのコード化

getDestinations()は、リンクに対して使用可能なすべてのワークアイテムのリストを返します。 ワークアイテムは、取得後、プロパティ値に対して照会できます。

  public List getDestinations(EbiWorkitem workitem) throws EboLinkException
    {
        List dests = (List) new Vector();
        // call Ebolink.getDestinations()to get ALL available destinations
        List availDests = getDestinations();
        Iterator destIt = dests.iterator();
        while(destIt.hasNext())
        {
            EbiDestination d = destIt.next();
  	 	 	 /*
            Get link properties and do logic ...
          */
        }
        return dests;
    }

リンクプロパティへのアクセス

ほとんどの場合、プロパティは、リンクパスが選択されるコンテキストを提供します。 アクティビティによってプロパティが設定され、リンクによってプロパティが読み込まれるというのが、ワークフローサブシステムのパターンです。 カスタムリンクプロパティがワークフローデザイナで定義されている場合は、次のメソッドを呼び出すことができます。

  protected NodeList getProperties ()

次に、特定の項目にアクセスするために、リストを解析します。 返されたプロパティの要素スキーマは、次のとおりです。

  <!ELEMENT property EMPTY>
  <!ATTLIST property
  name CDATA #REQUIRED
  type (int | double | long | boolean | timestamp | string) #REQUIRED
  value CDATA #IMPLIED
  immutable (true | false) #IMPLIED
  >
    First Previous Next Last ワークフローガイド  

Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC, a wholly owned subsidiary of Novell, Inc. All rights reserved.