SAP JCO설정(Server Side)

SAP JCO 서버 설정을 Step-by-Step으로 정리해 봅니다.

1. Service Marketplace에서 SAP JCO를 다운로드합니다.

2. 설치할 서버에 SAP JCO 파일 저장합니다.

3. 서버에 classpath, path 환경변수 지정 후, sapjco.jar 실행합니다.

4. 특별한 에러가 없다면, 예제 소스를 이용해 컴파일 합니다.

* Example5.java - Simple implementation of an (external RFC) server. This example is based on
* static metadata with non-unicode layout, so the calls only from non-unicode systems can be
* handled.
* Property of SAP AG, Walldorf
* (c) Copyright SAP AG, Walldorf, 2000-2003.
* All rights reserved.
*/
import com.sap.mw.jco.*;
import java.io.InputStream;
import java.util.*;
/**
* @version 1.0
* @author  SAP AG, Walldorf
*/
//******************************************************************************
public class Example5 implements JCO.ServerExceptionListener, JCO.ServerStateChangedListener {
//******************************************************************************
/**
*  Implementation of our own repository.
*  Just dummy extend the basic repository that comes with the JCO package
*/
static public class Repository extends JCO.BasicRepository implements IRepository {
   /**

     * Creates a new empty repository

     */

    public Repository(String name)

    {

      super(name);

    }

  }

  /** The repository we gonna be using */

  protected static IRepository repository;

  static {

    repository = new Repository("TestRepository");

    // non-unicode definition of functions. The server with this repository can

    // dispatch calls only from non-unicode systems

    //------------------------------------------------------------------------------

    //  Add function 'STFC_CONNECTION'

    //------------------------------------------------------------------------------

    JCO.MetaData fmeta = new JCO.MetaData("STFC_CONNECTION");

    fmeta.addInfo("REQUTEXT", JCO.TYPE_CHAR, 255,   0,  0, JCO.IMPORT_PARAMETER, null);

    fmeta.addInfo("ECHOTEXT", JCO.TYPE_CHAR, 255,   0,  0, JCO.EXPORT_PARAMETER, null);

    fmeta.addInfo("RESPTEXT", JCO.TYPE_CHAR, 255,   0,  0, JCO.EXPORT_PARAMETER, null);

    repository.addFunctionInterfaceToCache(fmeta);

    //------------------------------------------------------------------------------

    //  Add function 'STFC_STRUCTURE'

    //------------------------------------------------------------------------------

    fmeta = new JCO.MetaData("STFC_STRUCTURE");

    fmeta.addInfo("IMPORTSTRUCT", JCO.TYPE_STRUCTURE, 144, 0, 0, JCO.IMPORT_PARAMETER, "RFCTEST");

    fmeta.addInfo("ECHOSTRUCT",   JCO.TYPE_STRUCTURE, 144, 0, 0, JCO.EXPORT_PARAMETER, "RFCTEST");

    fmeta.addInfo("RESPTEXT",     JCO.TYPE_CHAR,      255, 0, 0, JCO.EXPORT_PARAMETER,  null    );

    fmeta.addInfo("RFCTABLE",     JCO.TYPE_TABLE,     144, 0, 0, 0,                    "RFCTEST");

    repository.addFunctionInterfaceToCache(fmeta);

    //------------------------------------------------------------------------------

    // Add the structure RFCTEST to the structure cache

    //------------------------------------------------------------------------------

    JCO.MetaData smeta  = new JCO.MetaData("RFCTEST");

    smeta.addInfo("RFCFLOAT",  JCO.TYPE_FLOAT,  8,  0, 0);

    smeta.addInfo("RFCCHAR1",  JCO.TYPE_CHAR,   1,  8, 0);

    smeta.addInfo("RFCINT2",   JCO.TYPE_INT2,   2, 10, 0);

    smeta.addInfo("RFCINT1",   JCO.TYPE_INT1,   1, 12, 0);

    smeta.addInfo("RFCICHAR4", JCO.TYPE_CHAR,   4, 13, 0);

    smeta.addInfo("RFCINT4",   JCO.TYPE_INT,    4, 20, 0);

    smeta.addInfo("RFCHEX3",   JCO.TYPE_BYTE,   3, 24, 0);

    smeta.addInfo("RFCCHAR2",  JCO.TYPE_CHAR,   2, 27, 0);

    smeta.addInfo("RFCTIME",   JCO.TYPE_TIME,   6, 29, 0);

    smeta.addInfo("RFRDATE",   JCO.TYPE_DATE,   8, 35, 0);

    smeta.addInfo("RFCDATA1",  JCO.TYPE_CHAR,   50,43, 0);

    smeta.addInfo("RFCDATA2",  JCO.TYPE_CHAR,   50,93, 0);

    repository.addStructureDefinitionToCache(smeta);

  }

  /**

   *  Implementation of my own server

   */

  static public class Server extends JCO.Server {

    /**

     *  Create an instance of my own server

     *  @param gwhost the gateway host

     *  @param gwserv the gateway service number

     *  @param progid the program id

     *  @param repository the repository used by the server to lookup the definitions of an inc

     */

    public Server(Properties prop, IRepository repository)

    {

      super(prop,repository);

    }

    /**

     *  Not really necessary to override this function but for demonstration purposes...

     */

    protected JCO.Function getFunction(String function_name)

    {

      JCO.Function function = super.getFunction(function_name);

      return function;

    }

    /**

     *  Not really necessary to override this method but for demonstration purposes...

     */

    protected boolean checkAuthorization(String function_name, int authorization_mode,

        String authorization_partner, byte[] authorization_key)

    {

      /* Simply allow everyone to invoke the services */

      return true;

    }

    /**

     *  Overrides the default method.

     *  Can handle only the two functions STFC_CONNECTION and STFC_STRUCTURE

     */

    protected void handleRequest(JCO.Function function)

    {

      JCO.ParameterList input  = function.getImportParameterList();

      JCO.ParameterList output = function.getExportParameterList();

      JCO.ParameterList tables = function.getTableParameterList();

      

      input.getBinaryStream("XFILE") ; 

      System.out.println("handleRequest(" + function.getName() + ")");

      if (function.getName().equals("STFC_CONNECTION")) {  <------ SAP RFC 호출

        output.setValue(input.getString("REQUTEXT"),"ECHOTEXT");

        output.setValue("This is a response from Example5.java","RESPTEXT");

      }

      else if (function.getName().equals("STFC_STRUCTURE")) {

        JCO.Structure sin  = input.getStructure("IMPORTSTRUCT");

        JCO.Structure sout = (JCO.Structure)sin.clone();

        try {

          System.out.println(sin);

        }

        catch (Exception ex) {

          System.out.println(ex);

        }

        output.setValue(sout,"ECHOSTRUCT");

        output.setValue("This is a response from Example5.java","RESPTEXT");

      }//if

      else if (function.getName().equals("ZFILE_TEST_JCO")) {

       InputStream ttt = input.getBinaryStream("RAW") ;        

       

      }

    }

  }

  /** List of servers */

  JCO.Server srv[] = new JCO.Server[1];

  /**

   *  Constructor

   */

  public Example5()

  {

    // Yes, we're interested in server exceptions

    JCO.addServerExceptionListener(this);

    // And we also want to know when the server(s) change their states

    JCO.addServerStateChangedListener(this);

  }

  /**

   *  Start the server

   */

  public void startServers()

  {

   

 Properties prop = new Properties() ; 

 prop.setProperty("jco.server.gwhost", "centsms") ;  <----- SAP Host

 prop.setProperty("jco.server.progid", "JCO_SERVER") ; <----- SAP Destination Program ID

 prop.setProperty("jco.server.gwserv", "sapgw00") ; <----- SAP Gateway

 prop.setProperty("jco.server.unicode", "1") ; <----- Unicode 설정 (소스코드 수정필요!)

    // Server 1 listens for incoming requests from system 1

    // (Change gateway host, service, and program ID according to your needs)

    srv[0] = new Server(prop,repository);

    // Server 2 listens for incoming requests from system 2

    // (Change gateway host, service, and program ID according to your needs)

    //srv[1] = new Server("centsms","sapgw00","JCOSERVER02",repository);

    for (int i = 0; i < srv.length; i++) {

      try {

        srv[i].setTrace(true);

        srv[i].start();

      }

      catch (Exception ex) {

        System.out.println("Could not start server " + srv[i].getProgID() + ":\n" + ex);

      }//try

    }//for

  }

  /**

   *  Simply prints the text of the exception and a stack trace

   */

  public void serverExceptionOccurred(JCO.Server server, Exception ex)

  {

    System.out.println("Exception in server " + server.getProgID() + ":\n" + ex);

    ex.printStackTrace();

  }

  /**

   *  Simply prints server state changes

   */

  public void serverStateChangeOccurred(JCO.Server server, int old_state, int new_state)

  {

    System.out.print("Server " + server.getProgID() + " changed state from [");

    if ((old_state & JCO.STATE_STOPPED    ) != 0) System.out.print(" STOPPED ");

    if ((old_state & JCO.STATE_STARTED    ) != 0) System.out.print(" STARTED ");

    if ((old_state & JCO.STATE_LISTENING  ) != 0) System.out.print(" LISTENING ");

    if ((old_state & JCO.STATE_TRANSACTION) != 0) System.out.print(" TRANSACTION ");

    if ((old_state & JCO.STATE_BUSY       ) != 0) System.out.print(" BUSY ");

    System.out.print("] to [");

    if ((new_state & JCO.STATE_STOPPED    ) != 0) System.out.print(" STOPPED ");

    if ((new_state & JCO.STATE_STARTED    ) != 0) System.out.print(" STARTED ");

    if ((new_state & JCO.STATE_LISTENING  ) != 0) System.out.print(" LISTENING ");

    if ((new_state & JCO.STATE_TRANSACTION) != 0) System.out.print(" TRANSACTION ");

    if ((new_state & JCO.STATE_BUSY       ) != 0) System.out.print(" BUSY ");

    System.out.println("]");

  }

  public static void main(String[] argv)

  {

 

    Example5 obj = new Example5();

    obj.startServers();

  }

}

5. SAP Destination 설정

설치버전 : SAP JCo 2.1.9, JDK1.5.0

Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments