Translate

viernes, 26 de septiembre de 2014

Crear Java Concurrent de ORACLE EBS

Java concurrent

Este articulo se encuentra en mi nueva web: 

ORACLE Java Concurrent Program en español


También encontraras muchos articulos mas: mariocelis.com

Java Concurrent Program FAQ

Como correr un Java Concurrent Program (JCP) desde el sistema operativo?

Sintaxis:

jre -Ddbcfile=<dbc filename with full path>
[ -Drequest.logfile=<logfile name> ]
[ -Drequest.requestid=<request id> ]
[ -Drequest.outfile=<output file name> ]
[ -Drequest.userid=<user id> ]
[ -Drequest.respappid=<resp appl id> ]
[ -Drequest.respid=<resp id> ]
[ -Drequest.secgrpid=<sec grp id> ]
[ -Drequest.enabletrace=<Y/N> ]
oracle.apps.fnd.cp.request.Run <program/class name>
[<parameters>]

Tome en cuenta que no hay ninguna nueva línea entre los argumentos de –D

Ejemplo:

jre -Ddbcfile=/d2/fnd/secure/appsnode_appdb.dbc
-Dreqeust.requestid=23453 -Drequest.logfile=./myreq.log
oracle.apps.fnd.cp.request.Run oracle.apps.wip.program.MyProg
"TOKEN1=value1:TOKEN2=value2"

Puedo usar constructor para mi clase del programa concurrente?

Se puede usar el constructor pero sin ningún argumento dentro.
Ejemplo:
class MyProg implements JavaConcurrentProgram {
// DO NOT USE MyProg(String arg1, int arg2...)

public void MyProg() {
...
}
public void runProgram(CpContext pCpContext) {
....
}
}

Como pasar parámetros al programa concurrente de java?

Un JCP usa la utilidad de APIS AOL/J Parameter List para el manejo de parámetros. Para pasar parámetros debes registrar los parámetros con el nombre de token al momento de creación del programa concurrente. En el JCP puedes acceder a los nombres de tokens registrados en la API AOL/J ParameterList y obtener el correspondiente valor para obtener el valor del parámetro.


Puedo usar diferente nombre de archivo de salida del nombre estándar?

Si se puede usar diferente nombre de archivo de salida llamando al método setOutFile de la clase OutFile.

Que pasa si yo no llamo al método setCompletion de ReqCompletion?

El request que estés usando con este programa terminara en error.


How To Create a Java Concurrent Program?

Como crear un programa concurrente de java?

Descripción general:

El proceso concurrente provee una interfaz JavaConcurrentProgram con el método abstracto runProgram() al cual le pasa el concurrente en context “CpContext”. El desarrollo del programa implementara toda la lógica de negocios en el método runProgram(). Que es el método principal implementado por AOL el cual llama a runProgram() después de hacer todas las inicializaciones requeridas para el programa concurrente incluyendo y estableciendo la conexión a base de datos, inicializando el context requerido y creando el archivo output de salida. CpContext tendrá los métodos log input y output para el request específico. El nombre de la clase con el método main serán registrados como nombre de archivo ejecutable de java en la forma de registro de ejecutables usando la API PL/SQL.

El desarrollador debe registrar la ruta completa del paquete para la clase en la forma de registro de ejecutables. Por ejemplo, si el producto wip crea una clase en:
$WIP_TOP/java/shopfloor/server/BackgroundProgram.class entonces esta clase va al archivo apps.zip con la ubicación del paquete:
oracle/apps/wip/shopfloor/server/BackgroundProgram.class’

El desarrollador registrara ‘BackgroundProgram’ como el nombre de archivo ejecutable y ‘oracle.apps.wip.shopfloor.server’ como la ruta de paquete en la forma de registro de ejecutables.

Los parámetros del programa concurrente de java se deben registrar con el nombre del token en la pantalla de parámetros de la forma del registro de programas concurrentes. El desarrollador puede obtener el valor del parámetro por el nombre del token dado en el java concurrent program. Este nombre de token será usado para pasar los valores de parámetros como parámetros String al Concurrent Program desde la línea de comandos para probar el Java Concurrent Program.



El desarrollador debe establecer el texto de status y completion para el Java Program usando el método setCompletion() proporcionado por AOL. El método runProgram() debe llamar al método setCompletion() para reportar el program completion status al Concurrent Manager. El programa debe establecer este completion status a “Normal”, “Warning” o “Error”. El Completion text es opcional.

Pasos para escribir un Java Concurrent Program

Primero necesitas crear un directorio dentro de $FND_TOP manualmente, ejemplo:$FND_TOP/java/cp/request entonces copiar el archivo Template.java del siguiente bloke de codificación.

Copiar el template Java Concurrent Program a $FND_TOP/java/cp/request/Template.java y empezar a codificar de acuerdo a sus requerimientos. Cambiar el nombre de archivo y de clase de su Java Concurrent Program name.

================= Template.java===========================
package oracle.apps.fnd.cp.request;
// Change the package name to the required one.
// import all the other required classes/packages.

import oracle.apps.fnd.util.*;
import oracle.apps.fnd.cp.request.*;

// Change the name of the class from Template to your concurrent program
// class name
public class Template implements JavaConcurrentProgram {


public void runProgram(CpContext pCpContext) {
ReqCompletion lRC = pCpContext.getReqCompletion();
String CompletionText = "";

lRC.setCompletion(ReqCompletion.NORMAL, CompletionText);
}
}
==================End of Template.java===========================



Lógica del programa

Implemente runProgram con la lógica de negocios de su Java Concurrent Program, runProgram() obtiene el CpContext. CpContext es una subclase de AOL/J AppsContext la cual provee miembros de clases especificas LogFile para escribir en request log file. OutFile para escribir en el request output file y ReqCompletion para establecer el completion status del request.

Parámetros del programa

CpContext usa AOL/J utility Parameter List para pasar parámetros al Java Concurrent Program. Refierase a AOL/J Parameter list para obtener una lista de los nombres de parámetros, pares de valores. Te referirás a la lista de nombres de parámetros como el nombre de parámetro y su correspondiente valor como el valor de parámetro en el Java Concurrent Program. Tienes que registrar los nombres de parámetros como nombres de tokens en la pantalla de parámetros del registro de programa concurrente.


Operaciones de base de datos

Use el metodo getJDBCConnection() para obtener el objeto de conexión para algunas operaciones JDBC dentro del programa y libere la conexión al pool de conexiones AppsContext. Use los métodos CpContext commit(), rollback() para hacer commit o rollback a las transacciones en la base de datos.


Establecer el request completion status

Llame al método setCompletion() del objeto ReqCompletion el cual es un miembro de CpContext antes de retornar de su Java Concurrent Program para establecer el completion status y opcionalmente el completion text.

Registrar el ejecutable

Registre el nombre de su clase Java Concurrent Program como execution_file_name y nombre de paquete execution_file_path en la forma de registro de programas ejecutables.

Registrar el programa concurrente

Registre su Java Concurrent Program como programa concurrente en la forma de registro de programas concurrentes. Registre todos los parámetros que usted quiere pasar al programa en la pantalla de parámetros de esta forma. Registre la lista de nombres de parámetros referida en el programa como los nombres de tokens en la pantalla de parámetros.



Ejemplo:
package oracle.apps.fnd.cp.request;
import java.io.*;
import java.sql.*;
import oracle.apps.fnd.util.*;

public class AvailableProg implements JavaConcurrentProgram {
String applName;

public AvailableProg() {
    // if no parameter value is specified for APPLNAME then use FND
    //as default value
    applName = "FND";
}

public void runProgram(CpContext pCpContext) {
// get the JDBC connection object
Connection mJConn = pCpContext.getJDBCConnection();
// get parameter list object from CpContext
ParameterList lPara = pCpContext.getParameterList();
// get ReqCompletion object from CpContext
ReqCompletion lRC = pCpContext.getReqCompletion();

String lQuery =
    " select substr(user_concurrent_program_name,1,70) , " +
    " decode(enabled_flag,'Y','Enabled','N','Disabled') " +
    " from fnd_concurrent_programs_vl cp, fnd_application_vl a " +
    " where cp.application_id = a.application_id " +
    " and a.application_short_name = ? " +
    " order by 1 " ;

// check for the APPLNAME parameter token name and if it there get
// value and use it as the application short name in the query
while (lPara.hasMoreElements()) {
    NameValueType aNVT = lPara.nextParameter();
    if ( aNVT.getName().equals("APPLNAME") )
    applName = aNVT.getValue();
}

try {
    PreparedStatement lStmt = mJConn.prepareStatement(lQuery);
    lStmt.setString(1, applName );
    ResultSet lRs = lStmt.executeQuery();

    // get OutFile object from CpContext
    OutFile lOF = pCpContext.getOutFile();
    // get LogFile object from CpContext
    LogFile lLF = pCpContext.getLogFile();


    lLF.writeln("Generating Programs for Application : " + applName, LogFile.STATEMENT);
    lOF.writeln(" Available Concurrent Programs for Application " + applName);
    lOF.writeln("Concurrent Program Name Enabled");
    lOF.writeln("-----------------------------------------------------------" );

    while( lRs.next()){
       lOF.writeln(lRs.getString(1) + " " + lRs.getString(2));
    }

    lLF.writeln("Generated Programs for Application : " + applName, LogFile.STATEMENT);
    lStmt.close();
    lRC.setCompletion(ReqCompletion.NORMAL, "Request Completed Normal"); 
    } catch (SQLException e) {
    lRC.setCompletion(ReqCompletion.ERROR, e.toString());
}
finally {
pCpContext.releaseJDBCConnection();
}
}
}


Ejemplo real:

Bajar las clases necesarias para compilar.

Entrar al SSH al directorio $JAVA_TOP/oracle/apps/fnd
Copiar las carpetas cp y util que son las que tienen las clases necesarias para compilar nuestro programa.

 

Una vez que tenemos esas clases, las agregamos a nuestro proyecto y empezamos a codificar nuestra clase ejecutable. La clase debe implementar la interfaz JavaConcurrentProgram y su método runProgram().


 

Cuando ya tengamos nuestra clase codificada con la estructura deseada la subimos al servidor y la compilamos.



Después procedemos a crear el programa ejecutable en la E-Businness Suite.

 


 
Posteriormente el programa concurrente asociado a nuestro ejecutable.



Por ultimo establecemos sus parámetros que sean parados como tokens al programa concurrente de java.

 

Pruebas de ejecución:

 

 
Salida de nuestro programa.

 

No hay comentarios.:

Publicar un comentario