Show TOC Start of Content Area

This graphic is explained in the accompanying text Beispielprogramm JCo Server  Locate the document in its SAP Library structure

Das folgende Beispiel enthält ein komplettes JCo Server-Programm. Es setzt sich aus den Code-Beispielen der Aktivitäten zusammen, die in den vorhergehenden Abschnitten beschrieben sind:

       Java-Programm zum Erstellen einer Server-Verbindung

       Exception Listener

       Server State Changed Listener

       Verarbeitung eines ABAP-Aufrufs

       tRFC-Aufruf verarbeiten

 

Syntax JCo Server-Programm

 

 

import java.io.File;

import java.io.FileOutputStream;

import java.util.Hashtable;

import java.util.Map;

import java.util.Properties;

 

import com.sap.conn.jco.JCoException;

import com.sap.conn.jco.JCoFunction;

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.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, "ls4065");

        connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "85");

        connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "800");

        connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "farber");

        connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "laska");

        connectProperties.setProperty(DestinationDataProvider.JCO_LANG,   "en");

        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, "binmain");

        servertProperties.setProperty(ServerDataProvider.JCO_GWSERV, "sapgw53");

        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 the destination file " + cfg.getName(), e);

            }

        }

    }

   

    static class StfcConnectionHandler implements JCoServerFunctionHandler

    {

        public void handleRequest(JCoServerContext serverCtx, JCoFunction function)

        {

            System.out.println("----------------------------------------------------------------");

            System.out.println("call              : " + function.getName());

            System.out.println("ConnectionId      : " + serverCtx.getConnectionID());

            System.out.println("SessionId         : " + serverCtx.getSessionID());

            System.out.println("TID               : " + serverCtx.getTID());

            System.out.println("repository name   : " + serverCtx.getRepository().getName());

            System.out.println("is in transaction : " + serverCtx.isInTransaction());

            System.out.println("is stateful       : " + serverCtx.isStatefulSession());

            System.out.println("----------------------------------------------------------------");

            System.out.println("gwhost: " + serverCtx.getServer().getGatewayHost());

            System.out.println("gwserv: " + serverCtx.getServer().getGatewayService());

            System.out.println("progid: " + serverCtx.getServer().getProgramID());

            System.out.println("----------------------------------------------------------------");

            System.out.println("attributes  : ");

            System.out.println(serverCtx.getConnectionAttributes().toString());

            System.out.println("----------------------------------------------------------------");

            System.out.println("req text: " + function.getImportParameterList().getString("REQUTEXT"));

            function.getExportParameterList().setValue("ECHOTEXT", function.getImportParameterList().getString("REQUTEXT"));

            function.getExportParameterList().setValue("RESPTEXT", "Hello World");

        }

    }

   

    static void step1SimpleServer()

    {

        JCoServer server;

        try

        {

            server = JCoServerFactory.getServer(SERVER_NAME1);

        }

        catch(JCoException ex)

        {

            throw new RuntimeException("Unable to create the server " + SERVER_NAME1 + ", because of " + ex.getMessage(), ex);

        }

       

        JCoServerFunctionHandler stfcConnectionHandler = new StfcConnectionHandler();

        DefaultServerHandlerFactory.FunctionHandlerFactory factory = new DefaultServerHandlerFactory.FunctionHandlerFactory();

        factory.registerHandler("STFC_CONNECTION", stfcConnectionHandler);

        server.setCallHandlerFactory(factory);

       

        server.start();

        System.out.println("The program can be stopped using <ctrl>+<c>");

    }

   

    static class MyThrowableListener implements JCoServerErrorListener, JCoServerExceptionListener

    {

       

        public void serverErrorOccurred(JCoServer jcoServer, String connectionId, Error error)

        {

            System.out.println(">>> Error occured on " + jcoServer.getProgramID() + " connection " + connectionId);

            error.printStackTrace();

        }

        public void serverExceptionOccurred(JCoServer jcoServer, String connectionId, Exception error)

        {

            System.out.println(">>> Error occured on " + jcoServer.getProgramID() + " connection " + connectionId);

            error.printStackTrace();

        }

    }

   

    static class MyStateChangedListener implements JCoServerStateChangedListener

    {

        public void serverStateChangeOccurred(JCoServer server, JCoServerState oldState, JCoServerState newState)

        {

            

            // Defined states are: STARTED, DEAD, ALIVE, STOPPED;

            // see JCoServerState class for details. 

            // Details for connections managed by a server instance

            // are available via JCoServerMonitor

            System.out.println("Server state changed from " + oldState.toString() + " to " + newState.toString() +

                    " on server with program id " + server.getProgramID());

        }

    }

 

    static void step2SimpleServer()

    {

        JCoServer server;

        try

        {

            server = JCoServerFactory.getServer(SERVER_NAME1);

        }

        catch(JCoException ex)

        {

            throw new RuntimeException("Unable to create the server " + SERVER_NAME1 + ", because of " + ex.getMessage(), ex);

        }

       

        JCoServerFunctionHandler stfcConnectionHandler = new StfcConnectionHandler();

        DefaultServerHandlerFactory.FunctionHandlerFactory factory = new DefaultServerHandlerFactory.FunctionHandlerFactory();

        factory.registerHandler("STFC_CONNECTION", stfcConnectionHandler);

        server.setCallHandlerFactory(factory);

       

        //additionally to step 1

        MyThrowableListener eListener = new MyThrowableListener();

        server.addServerErrorListener(eListener);

        server.addServerExceptionListener(eListener);

       

        MyStateChangedListener slistener = new MyStateChangedListener();

        server.addServerStateChangedListener(slistener);

 

        server.start();

        System.out.println("The program can be stopped using <ctrl>+<c>");

    }

   

    static class MyTIDHandler implements JCoServerTIDHandler

    {

       

        Map<String, TIDState> availableTIDs = new Hashtable<String, TIDState>();

       

        public boolean checkTID(JCoServerContext serverCtx, String tid)

        {

            System.out.println("TID Handler: checkTID for " + tid);

            if(availableTIDs.containsKey(tid))

                return false;

 

            //notify other instances about the starting of an tRFC call, if necessary

            availableTIDs.put(tid, TIDState.STARTED);

            return true;

        }

 

        public void commit(JCoServerContext serverCtx, String tid)

        {

            System.out.println("TID Handler: commit for " + tid);

 

            //react on commit e.g. commit on the database

            //if necessary throw a RuntimeException if the commit was not possible

            availableTIDs.put(tid, TIDState.FINISHED);

        }

 

        public void rollback(JCoServerContext serverCtx, String tid)

        {

            System.out.println("TID Handler: rollback for " + tid);

 

            //react on rollback e.g. rollback on the database

            availableTIDs.put(tid, TIDState.FINISHED);

        }

 

        public void confirmTID(JCoServerContext serverCtx, String tid)

        {

            System.out.println("TID Handler: confirmTID for " + tid);

 

            try

            {

                //clean up the resources

            }

            //catch(Throwable t) {} //partner wont react on an exception at this point

            finally

            {

                availableTIDs.remove(tid);

            }

        }

       

        private enum TIDState

        {

            STARTED, FINISHED;

        }

    }

   

   

    static void step3SimpleTRfcServer()

    {

        JCoServer server;

        try

        {

            server = JCoServerFactory.getServer(SERVER_NAME1);

        }

        catch(JCoException ex)

        {

            throw new RuntimeException("Unable to create the server " + SERVER_NAME1 + ", because of " + ex.getMessage(), ex);

        }

       

        JCoServerFunctionHandler stfcConnectionHandler = new StfcConnectionHandler();

        DefaultServerHandlerFactory.FunctionHandlerFactory factory = new DefaultServerHandlerFactory.FunctionHandlerFactory();

        factory.registerHandler("STFC_CONNECTION", stfcConnectionHandler);

        server.setCallHandlerFactory(factory);

       

        //additionally to step 1

        MyTIDHandler myTIDHandler = new MyTIDHandler();

        server.setTIDHandler(myTIDHandler);

 

        server.start();

        System.out.println("The program can be stopped using <ctrl>+<c>");

    }

       

 

    public static void main(String[] a)

    {

        step1SimpleServer();

        //step2SimpleServer();

        //step3SimpleTRfcServer();

    }

}

 

 

End of Content Area