Javaアクション・フォルト・ポリシーの使用方法

Javaアクション・フォルト・ポリシーを使用する際は、次の点に注意してください。

  • 用意されているJavaクラスは、特定のインタフェースに従っています。このインタフェースは文字列を戻します。実行後に取得する出力およびフォルト・ポリシーには、複数の値を指定できます。

  • 実装されているメソッドの出力値(戻り値)からフォルト・ポリシーへのマッピングを指定することで、追加のフォルト・ポリシーを実行できます。

  • ReturnValueが指定されていない場合は、次の例に示すように、デフォルトのフォルト・ポリシーが実行されます。

<Action id="ora-java">
  <javaAction className="mypackage.myclass"
    defaultAction="ora-human-intervention" propertySet="prop-for-billing">
   <!--defaultAction is a required attribute, but propertySet is optional-->
   <!-- attribute-->
     <ReturnValue value="RETRY" ref="ora-retry"/>   
     <!--value is not nilable attribute & cannot be empty-->
     <ReturnValue value="RETRHOW" ref="ora-rethrow-fault"/>
  </javaAction>
</Action>

表12-7に、ReturnValueの使用例を示します。

表12-7 システムによるJavaアクション・フォルト・ポリシーの解釈

コード 説明
<ReturnValue value="RETRY"
 ref="ora-retry"/>

メソッドからRETRYという文字列が戻された場合にora-retryアクションを実行します。

<ReturnValue value=""
  ref="ora-rethrow"/>

検証は失敗です。

<javaAction
 className="mypackage.myclass"
 defaultAction="ora-human-intervention">

Javaコード実行後にora-human-interventionを実行します。この属性は、メソッドからの戻り値が指定のReturnValueと一致しない場合に使用されます。

<ReturnValue value="RETRY"
 ref="ora-retry"/>
<ReturnValue value="" ref=""/>   

検証は失敗です。

<javaAction
 className="mypackage.myclass"
 defaultAction=" ora-human-intervention">
<ReturnValue></ReturnValue>

検証は失敗です。

Javaクラスを起動するには、IFaultRecoveryJavaClassインタフェースを実装しているクラスを指定できます。IFaultRecoveryJavaClassは、fabric-runtime.jarファイルにあります。パッケージ名は、oracle.integration.platform.faultpolicyです。

次の例に示すように、IFaultRecoveryJavaClassインタフェースには2つのメソッドがあります。

public interface IFaultRecoveryJavaClass
{
public void handleRetrySuccess( IFaultRecoveryContext ctx );
public String handleFault( IFaultRecoveryContext ctx );
}

次の詳細に注意してください。

  • handleRetrySuccessは、再試行に成功した場合に起動されます。再試行ポリシーは、retrySuccessActionのJavaアクションにチェーンします。

  • handleFaultは、javaActionタイプのポリシーを実行する際に起動されます。

  • フォルト・ポリシー・クラスは、次の2つのいずれかの方法でパッケージ化およびデプロイされます。

    • SOAコンポジット・アプリケーションを使用してJavaクラスをパッケージ化します。

    • Javaクラスを複数のSOAコンポジット・アプリケーションで共有する必要がある場合は、共有場所($MW_HOME/soa/soa/ modules/oracle.soa.ext_11.1.1など)に置きます。共有場所には、クラス・パスで使用できるようにするためのJavaクラスの配置方法を説明するreadmeファイルが含まれています。

次の例にIFaultRecoveryContextで使用可能なデータを示します。

public interface IFaultRecoveryContext {

/**
 * Gets implementation type of the fault.
 * @return
 */
public String getType();

/**
 * @return Get property set of the fault policy action being executed.
 */
public Map getProperties();

/**
 * @return Get fault policy id of the fault policy being executed.
 */
public String getPolicyId();

/**
 * @return Name of the faulted partner link.
 */
public String getReferenceName();

/**
 * @return Port type of the faulted reference .
 */
public QName getPortType();
}

このインタフェースのサービス・エンジン実装では、さらに詳細な情報が提供されます(たとえば、Oracle BPEL Process Manager)。次の例に詳細を示します。

public class BPELFaultRecoveryContextImpl extends BPELXExecLetUtil implements
IBPELFaultRecoveryContext,  IFaultRecoveryContext{
...
}

次の例に示すように、Oracle BPEL Process Manager固有のデータは、IBPELFaultRecoveryContextを使用して入手できます。

public interface IBPELFaultRecoveryContext {
public void addAuditTrailEntry(String message);

public void addAuditTrailEntry(String message, Object detail);

public void addAuditTrailEntry(Throwable t);
/**
 * @return Get action id of the fault policy action being executed.
 */
public String getActionId();

/**
 * @return Type of the faulted activity.
 */
public String getActivityId();

/**
 * @return Name of the faulted activity.
 */
public String getActivityName();

/**
 * @return Type of the faulted activity.
 */
public String getActivityType();

/**
 * @return Correleation id of the faulted activity.
 */
public String getCorrelationId();

/**
 * @return BPEL fault that caused the invoke to fault.
 */
public BPELFault getFault();

/**
 * @return Get index value of the instance
 */
public String getIndex(int i);

/**
 * @return get Instance Id of the current process instance of the faulted
 *         activity.
 */
public long getInstanceId();

/**
 * @return Get priority of the current process instance of the faulted
 *         activity.
 */
public int getPriority();

/**
 * @return Process DN.
 */
public ComponentDN getProcessDN();

/**
 * @return Get status of the current process instance of the faulted
 *         activity.
 */
public String getStatus();

/**
 * @return Get title of the current process instance of the faulted
 *         activity.
 */
public String getTitle();

public Object getVariableData(String name) throws BPELFault;

public Object getVariableData(String name, String partOrQuery)
throws BPELFault;

public Object getVariableData(String name, String part, String query)
throws BPELFault;

/**
 * @param priority
 *            Set priority of the current process instance of the faulted
 *            activity.
 * @return
 */
public void setPriority(int priority);

/**
 * @param status
 *            Set status of the current process instance of the faulted
 *            activity.
 */
public void setStatus(String status);

/**
 * @param title
 *            Set title of the current process instance of the faulted
 *            activity.
 * @return
 */
public String setTitle(String title);

public void setVariableData(String name, Object value) throws BPELFault;

public void setVariableData(String name, String partOrQuery, Object value)
throws BPELFault;

public void setVariableData(String name, String part, String query,
Object value) throws BPELFault;
}

次の例は、javaActionの実装例を示しています。

public class TestJavaAction implements IFaultRecoveryJavaClass {
public void handleRetrySuccess(IFaultRecoveryContext ctx) {
System.out.println("This is for retry success");
handleFault(ctx);
}
public String handleFault(IFaultRecoveryContext ctx) {		
System.out.println("-----Inside handleFault-----\n" + ctx.toString());

                dumpProperties(ctx.getProperties());
/* Get BPEL specific context here */
BPELFaultRecoveryContextImpl bpelCtx = (BPELFaultRecoveryContextImpl) ctx;
bpelCtx.addAuditTrailEntry("hi there");
System.out.println("Policy Id" + ctx.getPolicyId());
         ...
        }