2014년 6월 5일 목요일

SAP JCO설정(Server Side)

[출처 : http://itpe.me/ ]

1. Service Marketplace에서 SAP JCO를 다운로드합니다. http://service.sap.com/connectors    다운1다운2
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

댓글 4개:

  1. 정리해두신 것 잘 봤습니다. 자바 소스는 어떤 형태로 저장해 두어야 sap에서 호출이 가능한가요?

    답글삭제
    답글
    1. 일반적으로 sap rfc는 자바에서 호출해서 사용하기 위한 방법입니다.
      반대의 경우는 할수 없는 것으로 알고 있습니다.

      삭제
    2. 제가 모르고 있었는데 rfc destination을 이용하면 sap에서 타 시스템을 호출 할 수 있다고 하네요

      삭제