quinta-feira, 5 de junho de 2014

Utilizando a atividade Java Embedding no BPEL

Irei demonstrar um exemplo de como utilizar a atividade "Java Embedding" do BPEL.
Para o exemplo vou utilizar o seguinte cenário:
- Calcular a diferença de dias entre duas datas.

Passos:

1-) Crie um SOA Project

2-) Crie crie um BPEL na versão 2.0 sincrono



3-) Altere o xsd que foi gerado para o bpel adicionando dois campos do tipo dateTime como parametro de entrada
4-) Altere o xsd que foi gerado para o bpel adicionando um campo do tipo integer como parametro de saída


XSD:
<?xml version="1.0" encoding="UTF-8"?>
<schema attributeFormDefault="unqualified"
    elementFormDefault="qualified"
    targetNamespace="http://xmlns.oracle.com/MDSSampleApplication/JavaEmbeddingProject/JavaEmbeddingExample"
    xmlns="http://www.w3.org/2001/XMLSchema">
    <element name="process">
        <complexType>
            <sequence>
                                <element name="dateTime1" type="dateTime"/>
                                <element name="dateTime2" type="dateTime" />
            </sequence>
        </complexType>
    </element>
    <element name="processResponse">
        <complexType>
            <sequence>
                                <element name="dias" type="integer"/>
            </sequence>
        </complexType>
    </element>
</schema>


5-) Vá na aba source do BPEL gerado e na parte de import inclua o seguinte trecho:

<import location="oracle.xml.parser.v2.XMLElement" importType="http://schemas.oracle.com/bpel/extension/java"/>
    <import location="java.text.SimpleDateFormat" importType="http://schemas.oracle.com/bpel/extension/java"/>
    <import location="java.text.ParseException" importType="http://schemas.oracle.com/bpel/extension/java"/>
    <import location="java.util.Calendar" importType="http://schemas.oracle.com/bpel/extension/java"/>
 



6-) Na sessão "Oracle Extensions" arraste a atividade "Java Embedding" para o BPEL



7-) Duplo clique na atividade e verá a seguinte popup



8-) Em name altere para "MyJavaEmbedding"

9-) Insira o trecho de código abaixo:

try{
    long DAY_MILLESECONDS = 1000 * 60 * 60 * 24;
    Long differenceMillesenconds = 0L;
    Long dias = 0L;
   
    XMLElement xmlElement1 = (XMLElement)getVariableData("inputVariable","payload","/client:process/client:dateTime1");
    XMLElement xmlElement2 = (XMLElement)getVariableData("inputVariable","payload","/client:process/client:dateTime2");

    String dateTimeStr1 = xmlElement1.getTextContent();
    String dateTimeStr2 = xmlElement2.getTextContent();

    addAuditTrailEntry("Saida no AuditTrail -> dateTime1: " + dateTimeStr1);
    addAuditTrailEntry("Saida no AuditTrail -> dateTime2: " + dateTimeStr2);

    dateTimeStr1 = dateTimeStr1.replace("T"," ");
    dateTimeStr2 = dateTimeStr2.replace("T"," ");

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Calendar dateTime1 = Calendar.getInstance();
    Calendar dateTime2 = Calendar.getInstance();

    dateTime1.setTime(sdf.parse(dateTimeStr1));
    dateTime2.setTime(sdf.parse(dateTimeStr2));
   
    /*Remover hora minutos e segundos */
    dateTime1.set(dateTime1.get(Calendar.YEAR),
                  dateTime1.get(Calendar.MONTH),
                  dateTime1.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
    dateTime2.set(dateTime2.get(Calendar.YEAR),
                  dateTime2.get(Calendar.MONTH),
                  dateTime2.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
   
    differenceMillesenconds = dateTime1.getTimeInMillis() - dateTime2.getTimeInMillis();
    dias = differenceMillesenconds / DAY_MILLESECONDS;
   
    addAuditTrailEntry("Saida no AuditTrail -> dias: " + dias);
    setVariableData("outputVariable","payload","/client:processResponse/client:dias", new Integer(dias.intValue()));
} catch (Exception e){         
    System.out.println("exception "+e.getMessage());
    addAuditTrailEntry(e);
}





10-) Antes da atividade Java Embedding do seu processo BPEL, acrescente uma atividade do tipo "Assign" e inicialize o valor de retorno "dias" com o valor zero. É importante fazer esta atividade, pois quando executado o trecho java,  se a variável não foi inicializada, dará erro de xpath na execução do método setVariableData(...)



11-) Faça o deploy e execute um teste, no trace do bpel verá algo como:




Obs: se atente aos métodos de acesso e de escrita de parametros do BPEL (getVariableData(...), setVariableData(...)), os métodos que podem ser utilizados no java embedding estão descritos na tabela 14-1 do Oracle Fusion Middleware Developer's Guide for Oracle SOA Suite 11g Release 1 (11.1.1.7)

Um comentário: