zoukankan      html  css  js  c++  java
  • How to Create a Java Concurrent Program

    In this Document

      Goal
      Solution
      Overview
      Steps in writing Java Concurrent Program
      Template Program:
      Program Logic
      Program Parameters
      Database Operations
      Setting request Completion Status
      Register executable
      Register Concurrent Program
      Test Program from OS Prompt
      Sample Program
      Note:

    APPLIES TO:

    Oracle Concurrent Processing - Version 11.0.0 to 12.1.3 [Release 11 to 12.1]
    Information in this document applies to any platform.
    ***Checked for relevance on 01-Oct-2014***

    GOAL

    How to create a Java Concurrent Program?

    SOLUTION

    Overview

    Concurrent Processing provides an interface ‘JavaConcurrentProgram’ with abstract method runProgram() which passes the concurrent processing context ‘CpContext’. The concurrent program developer will implement all of their business logic for a concurrent program in runProgram(). The main() method, implemented by AOL, will call runProgram() after performing all of the required initialization for the concurrent program, including establishing a database connection, initializing the required contexts, and setting up the log and output files. CpContext will have the request specific log and output file input methods. The class name with the main method will be registered as the java executable file name in the register executable form or by using pl/sql API.

    Developer has to register the full package path for the class in register executable form. For example, if wip product creates a class in $WIP_TOP/java/shopfloor/server/BackgroundProgram.class, then this class goes to apps.zip file with package location ‘oracle/apps/wip/shopfloor/server/BackgroundProgram.class’. Developer will register ‘BackgroundProgram’ as the executable file name and ‘oracle.apps.wip.shopfloor.server’ as the package path in the register executable form. Developer has to follow the java notation to register the package path location, ‘.’ to denote the directory instead of ‘/’ in UNIX.

    Java Concurrent Program parameters must register with token names in the parameter screen of the register concurrent programs form. Developer can get the value of the parameter for a given token name in the java concurrent program. These token names will be used in passing the parameter values as parameter string to the concurrent program from the command line for testing the java concurrent program.

    Developer should set the status and completion text for the java program by using the setCompletion() method provided by AOL. The runProgram() method should call setCompletion() method to report the program completion status to the Concurrent Manager. The program may set its completion status to Normal, Warning or Error. Completion text is optional.

    Steps in writing Java Concurrent Program

    Template Program:


    You need to create the directory under $FND_TOP" manually first,
    e.g. $FND_TOP/java/cp/request
    then copy the Template.java from the coding block below.

    Copy the template Java Concurrent Program to $FND_TOP/java/cp/request/Template.java and start coding according to your requirement. Change file name and class name to your required name as 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
    {
    /** Optionally provide class constructor without any arguments.
    * If you provide any arguments to the class constructor then while
    * running the program will fail.
    */

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

    /* Code your program logic here.
    * Use getJDBCConnection method to get the connection object for any
    * JDBC operations.
    * Use CpContext provided commit,rollback methods to commit/rollback
    * data base transactions.
    * Don't forget to release the connection before returning from this
    * method.
    */


    /* Call setCompletion method to set the request completion status and
    * completion text.
    * Status values are ReqCompletion.NORMAL,ReqCompletion.WARNING,
    * ReqCompletion.ERROR.
    * Use Completion text message of length 240 characters. If it is more
    * than 240 then full string will appear in log file and truncated 240
    * characters will be used as request completion text.
    */
    lRC.setCompletion(ReqCompletion.NORMAL, CompletionText);
    }
    }
    ==================End of Template.java===========================



    Program Logic


    Implement the runProgram with your Java Concurrent Program business logic. runProgram() gets the CpContext . CpContext is a subclass of AOL/J AppsContext which provides the request specific member classes LogFile to write to request log file, OutFile to write to request output file and ReqCompletion to set the completion status of the request.

    Program Parameters

    CpContext uses the AOL/J utility Parameter List to pass the parameters to the Java Concurrent Program.
    Please refer AOL/J Parameter list to get the Parameter List name, value pairs. You will be referring parameter list name as the parameter name and corresponding value as the parameter value in the Java Concurrent Program. You have to register the parameter names as token name in the register concurrent program form Parameter screen.

    Database Operations

    Use getJDBCConnection method to get the connection object for any JDBC operations within program and release the connection to the AppsContext connection pool. Use CpContext's commit(), rollback() methods to commit or rollback the transactions in the database. These methods will set the program proffered rollback segments after commit or rollback segments for the rest of the database transaction in the Java Concurrent Program.

    Setting request Completion Status

    Call setCompletion() method of the ReqCompletion object which is a member of CpContext before returning from your Java Concurrent Program to set the completion status for the program and optional completion text.


    Register executable

    Register your Java Concurrent Program class name as execution_file_name and package name in execution_file_path in register concurrent executables form.

    Register Concurrent Program

    Register you Java Concurrent Program as concurrent program in the register concurrent program form. Register all the parameters that you want to pass to the program in the parameter screen of this form. Register the Parameter List names referred in the program as the token names in the parameter screen.


    Test Program from OS Prompt

    You can test your Java Concurrent Program from OS prompt by using the following syntax:

    java -Ddbcfile=<dbc filename with full path>
    [ -Drequest.logfile=<logfile name> ]
    [ -Drequest.requestid=<request id> ]
    [ -Drequest.outfile=<output file name> ]
    [ -Drequest.userid=<user id> ]
    [ -Drequest.respapplid=<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>]



    Example:

    java -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"


    If you don't specify the 'request.logfile' with -D option then the all the log file information will be printed to the standard output. Specify the 'request.requestid' to rerun already completed request. You can specify the all the application user specific context values with -D to get the specific user context to the program when run from the OS prompt. Pass all the parameters if any by using the AOL/J Parameter list syntax.

    Sample Program

    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();
       }
      }
    }

     

    Note:

    This is an example.  Oracle does not support this Sample in any way.
    Customizations are not supported neither.
    If you need additional assistance, please contact Oracle Consulting.

  • 相关阅读:
    IP报头结构
    C#组件项目设置与开发应用范例
    UDP数据报协议
    WOW 各等级属性换算表
    清理SQLSERVER日志
    正则表达式匹配EXCEL地址字符串
    TCP数据段格式
    MAC地址结构
    (转载) Delphi中打印条码的方法
    为了使用uart2, 发现6252中define了 SCCB_SERIAL_CLK_PIN 值为 22, 为了避免冲突, 手动修改其值为 23
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4505582.html
Copyright © 2011-2022 走看看