自己从网上把自己的代码拷回来,文章时间大约是2017年。
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>");
}
}

被折叠的 条评论
为什么被折叠?



