SAP JCO3 官网代码解读

SAP JCO版本 3.0.18, 官网例子代码文件 StepByStepServer.java

保留其中第4个例子函数,实现sap call  java server.

/* 第一步,SAP系统中,rz10里面参数gw/acl_mode的值要0才可以,运行SM59有注册网关服务。
/* 第二步,SAP系统中,SE37里面定义一个远程调用的函数JCO_SET_TRACE。
FUNCTION JCO_SET_TRACE.
*"----------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     VALUE(TRACE_LEVEL) TYPE  SY-LISEL
*"     VALUE(TRACE_PATH) TYPE  SY-LISEL
*"----------------------------------------------------------------------
ENDFUNCTION.

第三步,SE38里面做一个程序来调用这个远程的function
REPORT ZTEST_JCO_SET_TRACE.
DATA trace_level TYPE N.
        DATA trace_path TYPE STRING.

        DATA msg(255) TYPE C.


        trace_level = '555555555'.
        trace_path = '33333333333333.'.


        CALL FUNCTION 'JCO_SET_TRACE' destination 'JCO_SERVER'
          EXPORTING
            TRACE_LEVEL = trace_level
            TRACE_PATH = trace_path
         EXCEPTIONS
           COMMUNICATION_FAILURE       = 1
           SYSTEM_FAILURE              = 2 MESSAGE msg
           RESOURCE_FAILURE            = 3
           OTHERS                      = 4
                  .
        IF SY-SUBRC <> 0.
           write: 'ERROR: ',  SY-SUBRC, msg.
        ENDIF.

第四点,SM59中NCO连接项目里面,有一个“注册的服务器程序,程序标识【】”,需要同程序配置文件中,server参数
中的PROGRAM_ID一致。  这个程序名称,还可以在SMGW中的登陆客户端信息中看到。


在DEV系统测试通过,先放上代码,有空再来仔细解读。

import java.util.Hashtable;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;
import java.io.File;
import java.io.FileOutputStream;

import com.sap.conn.jco.AbapException;
import com.sap.conn.jco.JCoContext;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoField;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoFunctionTemplate;
import com.sap.conn.jco.JCoStructure;
import com.sap.conn.jco.JCoTable;
import com.sap.conn.jco.JCo;
import com.sap.conn.jco.JCoCustomRepository;
import com.sap.conn.jco.JCoListMetaData;
import com.sap.conn.jco.JCoMetaData;

import com.sap.conn.jco.ext.DestinationDataProvider;
import com.sap.conn.jco.ext.ServerDataProvider;

import com.sap.conn.jco.server.DefaultServerHandlerFactory;
import com.sap.conn.jco.server.JCoServer;
import com.sap.conn.jco.server.JCoServerContext;
import com.sap.conn.jco.server.JCoServerContextInfo;
import com.sap.conn.jco.server.JCoServerErrorListener;
import com.sap.conn.jco.server.JCoServerExceptionListener;
import com.sap.conn.jco.server.JCoServerFactory;
import com.sap.conn.jco.server.JCoServerFunctionHandler;
import com.sap.conn.jco.server.JCoServerState;
import com.sap.conn.jco.server.JCoServerStateChangedListener;
import com.sap.conn.jco.server.JCoServerTIDHandler;

public class StepByStepServer
{
    static String SERVER_NAME1 = "SERVER";
    static String DESTINATION_NAME1 = "ABAP_AS_WITHOUT_POOL";
    static String DESTINATION_NAME2 = "ABAP_AS_WITH_POOL";


	static  
		{
		Properties connectProperties = new Properties();
		connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST,"10.0.3.51");
		connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,"00");
		connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT,"100");
		connectProperties.setProperty(DestinationDataProvider.JCO_USER,"60489");
		connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD,"********");
		connectProperties.setProperty(DestinationDataProvider.JCO_LANG,"ZH");

		createDataFile(DESTINATION_NAME1, "jcoDestination",connectProperties);
		connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3");
		connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");

		createDataFile(DESTINATION_NAME2, "jcoDestination",connectProperties);

		Properties servertProperties = new Properties();
		servertProperties.setProperty(ServerDataProvider.JCO_GWHOST,"10.0.3.51");
		servertProperties.setProperty(ServerDataProvider.JCO_GWSERV,"3300");
		servertProperties.setProperty(ServerDataProvider.JCO_PROGID,"JCO_SERVER");
		servertProperties.setProperty(ServerDataProvider.JCO_REP_DEST,"ABAP_AS_WITH_POOL");
		servertProperties.setProperty(ServerDataProvider.JCO_CONNECTION_COUNT, "2");
		createDataFile(SERVER_NAME1, "jcoServer",servertProperties);
		}

	 static void createDataFile(String name, String suffix, Properties properties)
	 {
		 File cfg = new File(name+"."+suffix);

		 if(!cfg.exists())
		 { 
			 try
			 {
				 FileOutputStream fos = new FileOutputStream(cfg,false);
				 properties.store(fos, "for tests only !");
				 fos.close();
			 }

			catch (Exception e)
			{
			 throw new RuntimeException("Unable to create thedestination file " + cfg.getName(), e);
			}

		 }
	 } 
	 
    
    
    /**
     * The following server example demonstrates how to develop a function module available only on Java side. At first
     * we create the respective function meta data, because the function is not available in ABAP DDIC. Then the function
     * meta data is stored in a custom repository which is registered with the server instance. Naturally we also
     * need the implementation of the function - see the class SetTraceHandler. 
     * 
     * Last but not least, the following ABAP report invokes the function module SetTraceHandler.

        REPORT  ZTEST_JCO_SET_TRACE.
        
        DATA trace_level TYPE N.
        DATA trace_path TYPE STRING.
        DATA msg(255) TYPE C.
        
        trace_level = '5'.
        trace_path = '.'.
        
        CALL FUNCTION 'JCO_SET_TRACE' destination 'JCO_SERVER'
          EXPORTING
            TRACE_LEVEL = trace_level
            TRACE_PATH = trace_path
         EXCEPTIONS
           COMMUNICATION_FAILURE       = 1
           SYSTEM_FAILURE              = 2 MESSAGE msg
           RESOURCE_FAILURE            = 3
           OTHERS                      = 4
                  .
        IF SY-SUBRC <> 0.
           write: 'ERROR: ',  SY-SUBRC, msg.
        ENDIF.     
     */

    
    static class MyFunction implements JCoServerFunctionHandler
    {
        public void handleRequest(JCoServerContext serverCtx, JCoFunction function)
        {
            int level = function.getImportParameterList().getInt("TRACE_LEVEL");
            String path = function.getImportParameterList().getString("TRACE_PATH");

            System.out.println("A:" + level + " B:"+ path);
          //  JCo.setTrace(level, path);
        }
    }    


    public static void main(String[] a)
    {

       
        JCoListMetaData impList = JCo.createListMetaData("IMPORTS");
        impList.add("TRACE_LEVEL", JCoMetaData.TYPE_NUM, 1, 2, 0, null, null, JCoListMetaData.IMPORT_PARAMETER, null, null);
        impList.add("TRACE_PATH", JCoMetaData.TYPE_STRING, 8, 8, 0, null, null, JCoListMetaData.IMPORT_PARAMETER, null, null);
        impList.lock();
        JCoFunctionTemplate fT = JCo.createFunctionTemplate("JCO_SET_TRACE", impList, null, null, null, null);

		JCoCustomRepository cR = JCo.createCustomRepository("MyCustomRepository");
        cR.addFunctionTemplateToCache(fT); //Repository add FunctionTemplate
        
        JCoServer server ;

		try
        {
            server = JCoServerFactory.getServer(SERVER_NAME1); //create server
        }
        catch(JCoException ex)
        {
            throw new RuntimeException("Unable to create the server " + SERVER_NAME1 + " because of " + ex.getMessage(), ex);
        }
       
        
        String repDest = server.getRepositoryDestination();
		System.out.println("repDest:"+ repDest);

        if(repDest!=null)
        {
            try
            {
                cR.setDestination(JCoDestinationManager.getDestination(repDest)); //Repository setDestination
            }
            catch (JCoException e) 
            {               
            }
        }
		
        server.setRepository(cR); //server add Repository
        
        
        JCoServerFunctionHandler myf = new MyFunction();
        DefaultServerHandlerFactory.FunctionHandlerFactory factory = new DefaultServerHandlerFactory.FunctionHandlerFactory();
        factory.registerHandler(fT.getName(), myf);
        server.setCallHandlerFactory(factory);
        
        server.start();
        System.out.println("The program can be stoped using <ctrl>+<c>");
    }
}


猜你喜欢

转载自blog.csdn.net/ot512csdn/article/details/80559098
SAP
今日推荐