Este exemplo esta dividido em duas partes, nessa primeira parte vou demonstrar como configurar os arquivos de Fault Policy chamando uma Java Class Custom como Action para o fault. Já na segunda parte vamos ver como adicionar a configuração ao MDS do SOA, facilitando o acesso e manutenção ao fault policy.
1. Definindo o Fault Policy
Vamos começar com o exemplo de configuração dos arquivos para o Fault Policy, veja a construção dos arquivos fault-policies.xml e fault-bindings.xml
Exemplo para o arquivo fault-policies.xml.
...
<Conditions>
<faultName xmlns:bpelx="http://schemas.oracle.com/bpel/extension"
name="bpelx:remoteFault">
<condition>
<action ref="ora-custom-retry"/>
</condition>
</faultName>
<faultName xmlns:bpelx="http://schemas.oracle.com/bpel/extension"
name="bpelx:bindingFault">
<condition>
<action ref="ora-custom-retry"/>
</condition>
</faultName>
</Conditions>
<Actions>
<Action id="ora-custom-retry">
<javaAction className="com.lucianosilva.lab.soa.CompositeFaultHandler"
defaultAction="ora-human-intervention">
<returnValue value="ERROR" ref="ora-terminate"/>
<returnValue value="ABORT" ref="ora-terminate"/>
<returnValue value="RETRY" ref="ora-retry"/>
<returnValue value="MANUAL" ref="ora-human-intervention"/>
</javaAction>
</Action>
<Action id="ora-retry">
<retry>
<retryCount>2</retryCount>
<retryInterval>3</retryInterval>
<exponentialBackoff/>
</retry>
</Action>
<Action id="ora-replay-scope">
<replayScope/>
</Action>
<Action id="ora-rethrow-fault">
<rethrowFault/>
</Action>
<Action id="ora-human-intervention">
<humanIntervention/>
</Action>
<Action id="ora-terminate">
<abort/>
</Action>
</Actions>
...
Definição do arquivo fault-bindings.xml.
<?xml version="1.0" encoding="UTF-8" ?>
<faultPolicyBindings version="2.0.1" xmlns="http://schemas.oracle.com/bpel/faultpolicy" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<composite faultPolicy="fault-policies"/>
</faultPolicyBindings>
2. Java Action Class
Agora, com os arquivos de policy definidos, vamos construir a classe que irá receber a exception ocorrida no BPEL. No seu projeto adicione as duas classes orabpel.jar e fabric-runtime.jar, se você utiliza o JDeveloper configure-o como a imagem abaixo.

package com.lucianosilva.lab.soa;
import java.util.Collection;
import java.util.Map;
import oracle.integration.platform.faultpolicy.IFaultRecoveryContext;
import oracle.integration.platform.faultpolicy.IFaultRecoveryJavaClass;
import com.collaxa.cube.engine.fp.BPELFaultRecoveryContext;
/**
* @author luciano silva
*
*/
public class CompositeFaultHandler implements IFaultRecoveryJavaClass {
private static final String RETURN_ERROR = "ERROR";
private static final String RETURN_MANUAL = "MANUAL";
private static final String RETURN_RETRY = "RETRY";
/**
*
*/
public CompositeFaultHandler() {
super();
}
/**
*
* @param iFaultRecoveryContext
* @return
*/
public String handleFault( IFaultRecoveryContext iFaultRecoveryContext ) {
// print all fault details
System.out.println("==========");
System.out.println("Fault Policy Id : " + iFaultRecoveryContext.getPolicyId());
System.out.println("Fault Type : " + iFaultRecoveryContext.getType());
System.out.println("Partnerlink : " + iFaultRecoveryContext.getReferenceName());
System.out.println("Port Type : " + iFaultRecoveryContext.getPortType());
if( iFaultRecoveryContext instanceof BPELFaultRecoveryContext ){
//
BPELFaultRecoveryContext bctx = (BPELFaultRecoveryContext) iFaultRecoveryContext;
System.out.println("BPEL ActionId : " + bctx.getActionId() );
System.out.println("BPEL ActivityId : " + bctx.getActivityId() );
System.out.println("BPEL ActivityName : " + bctx.getActivityName() );
System.out.println("BPEL ActivityType : " + bctx.getActivityType() );
System.out.println("BPEL CorrelationId : " + bctx.getCorrelationId() );
System.out.println("BPEL PartnerLinkName: " + bctx.getPartnerLinkName() );
System.out.println("BPEL Fault : " + bctx.getFault().getFaultName() );
System.out.println( bctx.getFault().getMessage() );
}
if( iFaultRecoveryContext.getProperties() != null ){
System.out.println("Properties found in propertySet:");
// print all properties defined in the fault-policy file
Map props = iFaultRecoveryContext.getProperties();
Collection list = props.values();
for (String value : list) {
System.out.println( value );
}//
}
System.out.println("==========");
return RETURN_MANUAL;
}
/**
*
* @param iFaultRecoveryContext
*/
public void handleRetrySuccess( IFaultRecoveryContext iFaultRecoveryContext ) {
System.out.println("SUCCESS.");
}
}
Após compilar a classe acima, vamos empacotar em um arquivo .jar, faça isso:
jar -cf fault-policy-javaaction.jar ./com/lucianosilva/lab/soa/*.class
Lembre-se, de usar \ se estiver no windows.
3. Adicionando Java Class (Jar) ao classpath do Weblogic
Você precisará que seu Jar seja adicionado ao classpath do Weblogic, para que em runtime a classe seja reconhecida pelo contexto e o Faut Policy funcione. O Apache Ant deve estar obrigatóriamente configurado no servidor.
O processo é muito simples, faça shutdown do servidor Weblogic, depois copie o arquivo .Jar para o diretório do servidor Weblogic $ORACLE_MIDDLEWARE_HOME/soa/modules/oracle.soa.ext_11.1.1/classes. Vá para no diretório oracle.soa.ext_11.1.1, aqui temos o build.xml, por fim, execute o Ant.

Pronto, está concluída a configuração de um exemplo para Fault Policy.
Para que as falhas do seu BPEL seja manipulada pela classe Java, as policies devem ser adicionadas ao arquivo composite.xml.
Veja na próxima parte deste post, como adicionar os XMLs de configuração do Fault Policy ao MDS e um BPEL utilizando esta configuração.
Download
Arquivos XML do Fault Policy
Projeto Java
Referências
http://docs.oracle.com/cd/E12839_01/integration.1111/e10224/bp_faults.htm
http://ant.apache.org/