JCo/JBOSS/JCA Adaptor集成笔记

转自一篇老文章: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 ;
        }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值