Jco服务配置以及程序编写
Jco服务配置以及程序编写
SAP 与第三方面软件进行数据通信时,运用到的中间件JCO,以下是JCO的服务配置.以及程序的编写,希望能给大家带来点帮助
SAP与java进行通信的流程:
操作步骤
ABAP(作为Clint端),调用JAVA(作为服务器端)。
首先,JCo服务器程序在网管中的注册
下面给出该程序的JCo服务器程序在SAP网关中的注册步骤。
(1) 在SM59中,定义一个连接类型为T的远程目标
单击创建按钮,如下图所示,要步骤一步一步填入所需要的数据
RFC目标系统,是RFC调用时候使用的。 Program ID,是JAVA程序中使用的,此处为LDKJCO,
这里的Geteway Host就是下图的应用程序服务器地址。 TCP服务sapgw是固定的,后面的00就是下图的系统编号。
特别要注意的是,下面图要默认NON-Unicode,因为这个标示影响Java代码中的Unicode设置。其它的默认就可以
上述配置完成即可。
测试连接,当然在做这测试连接之前先要将sap程序和JAVA程序的参数设置好,具体步骤看 sap程序和JAVA程序的设置,如下
sap程序编写
创建一个测试程序,程序名zldkjco(自定义)
代码如下:
REPORT ZLDKJCO.
DATA: REQUTEXT LIKE SY-LISEL,
RESPTEXT LIKE SY-LISEL,
ECHOTEXT LIKE SY-LISEL.
DATA: RFCDEST like rfcdes-rfcdest VALUE ‘NONE’.
DATA: RFC_MESS(128).
REQUTEXT = ‘HELLO WORLD’.
RFCDEST = ‘LDKJCO’. “corresponds to the destination name defined in the SM59
CALL FUNCTION ‘STFC_CONNECTION’ DESTINATION RFCDEST
EXPORTING
REQUTEXT = REQUTEXT
IMPORTING
RESPTEXT = RESPTEXT
ECHOTEXT = ECHOTEXT
EXCEPTIONS
SYSTEM_FAILURE = 1 MESSAGE RFC_MESS
COMMUNICATION_FAILURE = 2 MESSAGE RFC_MESS.
IF SY-SUBRC NE 0.
WRITE: / ‘Call STFC_CONNECTION SY-SUBRC = ’, SY-SUBRC.
WRITE: / RFC_MESS.
ENDIF.
接下来JAVA开发代码,代码的具体的操作可以在ECLIPSE中完成(要完成JCO的布置和JDK路径的设置)
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 MyTIDHandler myTIDHandler = null;
static
{
Properties connectProperties = new Properties();
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, “10.0.0.6″);
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, “00″);
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, “800″);
connectProperties.setProperty(DestinationDataProvider.JCO_USER, “XIAOFR”);
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, “123456789″);
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, “10.0.0.6″);
servertProperties.setProperty(ServerDataProvider.JCO_GWSERV, “sapgw00″);
servertProperties.setProperty(ServerDataProvider.JCO_PROGID, “LDKJCO”);
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(“CPIC conversation ID: “ + serverCtx.getConnectionAttributes().getCPICConversationID());
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”);
// In sample 3 (tRFC Server) we also set the status to executed:
if(myTIDHandler != null)
myTIDHandler.execute(serverCtx);
}
}
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 stoped using <ctrl>+<c>”);
}
static class MyThrowableListener implements JCoServerErrorListener, JCoServerExceptionListener
{
public void serverErrorOccurred(JCoServer jcoServer, String connectionId, JCoServerContextInfo serverCtx, Error error)
{
System.out.println(“>>> Error occured on “ + jcoServer.getProgramID() + ” connection “ + connectionId);
error.printStackTrace();
}
public void serverExceptionOccurred(JCoServer jcoServer, String connectionId, JCoServerContextInfo serverCtx, 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 stoped using <ctrl>+<c>”);
}
static class MyTIDHandler implements JCoServerTIDHandler
{
Map<String, TIDState> availableTIDs = new Hashtable<String, TIDState>();
public boolean checkTID(JCoServerContext serverCtx, String tid)
{
// This example uses a Hashtable to store status information. But usually
// you would use a database. If the DB is down, throw a RuntimeException at
// this point. JCo will then abort the tRFC and the R/3 backend will try
// again later.
System.out.println(“TID Handler: checkTID for “ + tid);
TIDState state = availableTIDs.get(tid);
if(state == null)
{
availableTIDs.put(tid, TIDState.CREATED);
return true;
}
if(state == TIDState.CREATED || state == TIDState.ROLLED_BACK)
return true;
return false;
// “true” means that JCo will now execute the transaction, “false” means
// that we have already executed this transaction previously, so JCo will
// skip the handleRequest() step and will immediately return an OK code to R/3.
}
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.COMMITTED);
}
public void rollback(JCoServerContext serverCtx, String tid)
{
System.out.println(“TID Handler: rollback for “ + tid);
availableTIDs.put(tid, TIDState.ROLLED_BACK);
// react on rollback e.g. rollback on the database
}
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);
}
}
public void execute(JCoServerContext serverCtx)
{
String tid = serverCtx.getTID();
if(tid != null)
{
System.out.println(“TID Handler: execute for “ + tid);
availableTIDs.put(tid, TIDState.EXECUTED);
}
}
private enum TIDState
{
CREATED, EXECUTED, COMMITTED, ROLLED_BACK, CONFIRMED;
}
}
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 = new MyTIDHandler();
server.setTIDHandler(myTIDHandler);
server.start();
System.out.println(“The program can be stoped using <ctrl>+<c>”);
}
public static void main(String[] a)
{
// step1SimpleServer();
step2SimpleServer();
// step3SimpleTRfcServer();
}
}
在ECLIPSE中编写完成后,在ECLIPSE中可以运行程序,运行成功如下图:
运行成功后会产生一个SERVER.jcoserver,点击此文件可以看到如果下的信息,连接成功。
最后在SAP中,运行TCODE:SM59,选中你所创建的远程目标,此处为LDKJCO。点连接后出下图,说明SAP可以与JCO通信,SAP可以往JCO发数据。
Jco服务配置以及程序编写相关推荐
- 【小程序】腾讯云服务配置小程序流程
配置小程序流程 [小程序]SSL配置 [小程序]Nginx配置https协议 [小程序]微信小程序配置
- GPS服务端解析程序编写日记
最近在编写jt/808 标准的服务器解析程序,在编写的过程中遇到的各种问题我都会在这里写出,希望能与各位多交流.此篇算是个序吧.
- GPS服务端解析程序编写日记之--vs2010中多种语言开发及调试的若干注意事项
最近在写一个gps协议的解析程序,因为先前的库文件大部分都是用C#写的,而考虑到系统运行的速度,及窗口界面的操作的方便性.有关界面的部分,我准备用cli/c++写,毕竟c++与api打交道还是方便的. ...
- linux dhcp 服务失败,Centos7安装及配置DHCP服务,安装程序配置服务失败
Centos7安装及配置DHCP服务,安装程序配置服务失败 DHCP服务概述: 名称:DHCP - Dynamic Host Configuration Protocol 动态主机配置协议. 功能 ...
- 简化管理面向服务的应用程序的创建
控件可以让开发人员专注于编写应用程序逻辑和委派基础性架构问题,如异步消息传送.会话和与远程资源的连接.但仍有很多复杂问题使这些应用程序难以管理. 在本文中,我们将使用内建的Weblogic Works ...
- spring boot pom配置_125 SpringCloud服务配置中心
1. 为什么需要使用配置中心 (1) 常用的配置管理解决方案有哪些缺点? 硬编码:需要修改代码的话繁琐且风险大: 配置写在properties里面,在集群环境下,需要替换和重启: 写在xml文件中,一 ...
- Linux之systemd服务配置及自动重启
Linux之systemd服务配置及自动重启 0 背景 在linux上开发时,往往需要将自己的程序做成服务,并且实现服务开机自动重启,以及服务崩溃后自动重启功能,本文就对该功能的实现做简单介绍,实现方 ...
- Spring Cloud Config统一管理微服务配置
一Spring Cloud Config背景及简介 # 集中管理的需求:一个使用微服务架构的应用系统可能会包括成百上千个微服务,因此集中管理很有必要 # 不同环境不同配置:例如数据源在不同的环境(开发 ...
- python自助电影售票机_Spring Cloud版——电影售票系统六使用 Spring Cloud Config 统一管理微服务配置...
一. 为什么要统一管理微服务配置 在传统的单体应用,常使用配置文件管理所有配置.比如,一个 Spring Boot 开发的单体应用,可将配置内容放在 application.yml 文件中.如果需要切 ...
最新文章
- 通信经典书籍(转载)
- linux的有趣命令,Linux有趣小命令之艺术字
- axios打包放到服务器上接口地址404_如何把网页文件放到云虚拟主机
- lstm需要优化的参数_使用PyTorch手写代码从头构建LSTM,更深入的理解其工作原理...
- VScode编辑器设置中文界面教程
- html京东快报,练习3:仿京东快报.html
- Tcp-IP详解之Telnet
- dell 恢复介质_使用 Dell 恢复介质重新安装操作系统
- OpenCV4图像处理算子不完全手册-应用篇
- 灵敏性,特异性,阳性预测值,阴性预测值
- TestNG 单元测试框架的使用
- 基于OpenCV-python3实现抠图替换背景图
- tensorflow2.0 实现MTCNN、P_net数据生成,及训练-1
- python实用大全pdf_超级实用干货|九大技巧,带你用Python玩转PDF
- DFS Cut twigs
- 通路、回路、路径的区别
- 人工智能在无人驾驶中的应用
- 关于win10安装silverlight成功 之后还是提示要安装的解决方案__2021年9月
- Windows系统下的PDF编辑工具软件-PDF编辑器下载
- Sourcetree使用教程,拉取代码克隆、解决冲突、合并分支
热门文章
- android EditText 控件中加入图片(非背景图片)
- (王道408考研数据结构)第七章查找-第二节1:顺序查找及其优化
- (计算机组成原理)第二章数据的表示和运算-第二节3:定点数的移位运算(算数移位、逻辑移位和循环移位)
- ubuntu下pip的安装、升级和使用
- twisted系列教程十三–deferred 中的deferred
- 树:二叉树的层序遍历算法(超简洁实现及详细分析)
- 【洛谷习题】南蛮图腾
- Mybatis的动态sql语句的查询
- 【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp
- 软件工程实践2017结对第二次作业