JCo/JBOSS/JCA Adaptor集成笔记

来源:互联网 发布:金本位 知乎 编辑:程序博客网 时间:2024/05/29 03:36

转自一篇老文章:http://www.itpub.net/thread-1098733-1-4.html

Q1. 为什么还用JCo,而不用SAP JRA呢?
A1. SAP JRA只在netweaver java stack上面运行,纯ABAP stack没法跑。


Q2. 为什么非用JCA
A2. 为了利用强大的J2EE Server的现成功能来管理连接


Q3. 为什么用sap-bapi-jca-adapter
A3. 因为不要重新发明轮子,而且发明轮子需要耗费很长的时间


Q4. 什么是sap-bapi-jca-adapter?从哪里下载文档在哪里?例子在哪里?
A4. 这是个开源项目,提供了对JCo的JCA封装,项目首页在http://www.techjava.de/projects/sap-bapi-jca-adapter/,文档,代码等可从sf.net找到,http://sourceforge.net/projects/sapbapijcaadapt/。例子暂时没找到,你可以参考本文,或者参考项目的单元测试程序

Q5. 怎么编译代码
A5. 因为项目还比较原始,有不少代码错误,可能需要修改代码,建议大家下载源代码自己编译。当然,你要遵守项目的License,LGPL,共享出你的所有修改和增强。编译时需要注意几点。
0. 用Eclipse或其他CVS工具从sf.net下载代码
1. 从https://websmp202.sap-ag.de/~sapidb/011000358700007415502002E下载sapjco3-ntintel-3.0.1.zip和sapjco-ntintel-2.1.8.zip,展开
2. 在项目根目录下建立ext-lib文件夹,将sapjco.jar和sapjco3.jar拷贝过去
3. 用ant编译,或在eclipse下用ant编译
4. build.xml中property name="distr.dir.jboss"对应的是jboss server的地址,应该将这句话删除,可以在project.properties中用distr.dir.jboss属性来指定jboss的地址
5. 编译后会执行部署操作,将sapcrm-jboss-ds.xml和sap-bapi-adapter.rar两个文件拷贝至distr.dir.jboss中

Q6. JBOSS中怎么配置
A6. 以jboss-4.2.3.GA为例说明
1. 将sapjco.jar,sapjco3.jar,sapjcorfc.dll,sapjco3.dll复制到jboss/server/default/lib或类似目录中
2. 确保librfc32.dll在windows\system32下,这个文件装了sap gui就有了,如果没有,jco2的包里
3. 修改jboss/server/default/conf下的jbossjta-properties.xml文件, 在<properties depends="arjuna" name="jta">下增加<property name="com.arjuna.ats.jta.allowMultipleLastResources" value="true"/>
4. 将jboss/server/default/deploy下sapcrm-jboss-ds.xml复制成sap-bapi-adapter-jboss-ds.xml,并修改其中的<jndi-name>以及以下几个config-property
host
systemNumber
repositoryName,这个填任意字符串即可,建议用SID
client
UserName
Password
Language
并增加<config-property name="destinationFactory" type="java.lang.String">net.sf.sapbapijca.adapter.jco.JCo2DestinationFactory</config-property>
**这里指定了使用JCo2的库,暂时使用JCo3的库有点问题,我还在研究

Q7. 好了,下面怎么调用ABAP那边的函数呢?
A7. 示例代码如下,JCo2版本,JCo3的我正在研究中

import java.util.Map;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;import javax.resource.ResourceException;import javax.resource.cci.Connection;import javax.resource.cci.ConnectionFactory;import javax.resource.cci.Interaction;import javax.resource.cci.InteractionSpec;import javax.resource.cci.MappedRecord;import javax.resource.cci.RecordFactory;import net.sf.sapbapijca.adapter.cci.InteractionSpecImpl;....        Connection connection = null;        try        {            Context initctx = new InitialContext();            ConnectionFactory factory = (ConnectionFactory)initctx.lookup("java:eis/sap/demo");                        connection = factory.getConnection();            Interaction interaction = connection.createInteraction();            InteractionSpec spec = new InteractionSpecImpl("RFC_READ_TABLE");            RecordFactory recordFactory = factory.getRecordFactory();            MappedRecord in = recordFactory.createMappedRecord("INPUT");            in.put("QUERY_TABLE", "TB027T");                        MappedRecord resultRecord = (MappedRecord)interaction.execute(spec, in);            for(Object entry : resultRecord.entrySet())            {                Object key = ((Map.Entry)entry).getKey();                Object value = ((Map.Entry)entry).getValue();                                log.info("Key: " + key.toString());                log.info("Value: " + value.toString());            }                    }        catch (NamingException e)        {            e.printStackTrace();        }        catch (ResourceException e)        {            e.printStackTrace();        }        finally        {            if (connection != null)                try                {                    connection.close();                }                catch (ResourceException e)                {                    e.printStackTrace();                }        }

Q8. 你的代码一跑就出null pointer错误
A8. opensource的嘛,当然有些错误。修改net.sf.sapbapijca.adapter.jco.JCo2RecordImpl文件,149行

        public int getFieldCount()        {                return record != null ? record.getFieldCount() : 0 ;        }


原创粉丝点击