Java通过Jco连接到多个SAP系统

时间:2014-08-28 13:50:06

标签: java sap jco

我目前正在开发一个需要从SAP读取一些数据的小型Java应用程序。 几乎一切都很好。 我可以连接到SAP,我可以调用BAPI并获得结果,我也可以处理给定的结果。但....

我有两个不同的SAP系统(系统A和系统B)。

如果我启动我的应用程序并连接到系统A,一切都很好。但是,在处理完系统A的所有数据之后,我想调用系统B(不停止/重新启动我的应用程序)。在这种情况下,我无法连接到系统B.

我认为与SAP系统建立连接的部分一定有问题。

任何人都可以告诉我如何做到这一点吗?

这是我的代码:

这是我建立连接的方式(SapLogOn和SapSystem只是所需参数的包装类)

private void connectToSap(ISapLogOn logOn, ISapSystem system)
            throws JCoException {

        connectProperties = new Properties();
        connectProperties.setProperty("ACTION", "CREATE");
        connectProperties.setProperty(DestinationDataProvider.JCO_DEST, "POOL_DE");
        connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, system.getAsHost());
        connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, system.getSysNr());
        connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, system.getClient());
        connectProperties.setProperty(DestinationDataProvider.JCO_USER, logOn.getUserName());
        connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, logOn.getPassword());
        connectProperties.setProperty(DestinationDataProvider.JCO_LANG, system.getLanguage());
        connectProperties.setProperty(DestinationDataProvider.JCO_SAPROUTER, system.getSapRouterString());
        connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, system.getPoolCapacity());
        connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, system.getPeakLimit());

        MyDestinationDataProvider myProvider = new MyDestinationDataProvider();

        if (!com.sap.conn.jco.ext.Environment
                .isDestinationDataProviderRegistered()) {
            com.sap.conn.jco.ext.Environment
                    .registerDestinationDataProvider(myProvider);
        }
        myProvider.changePropertiesForABAP_AS(connectProperties);
    }

这是第二部分:

public class MyDestinationDataProvider implements DestinationDataProvider {

    public static Logger LOGGER = Logger.getLogger(MyDestinationDataProvider.class.getName());
    @SuppressWarnings("unused")
    private DestinationDataEventListener eL;
    private Hashtable<String, Properties> propertiesTab;

    public MyDestinationDataProvider() {
        this.propertiesTab = new Hashtable<String, Properties>();
        this.eL = new DestinationDataEventListener() {

            @Override
            public void updated(String arg0) {}

            @Override
            public void deleted(String arg0) {}
        };
    }

    public Properties getDestinationProperties(String destinationName)
    {
        if(propertiesTab.containsKey(destinationName)){
            return propertiesTab.get(destinationName);
        }
        LOGGER.error("Destination " + destinationName + " is not available");
        throw new RuntimeException("Destination " + destinationName + " is not available");
    }

    public void setDestinationDataEventListener(DestinationDataEventListener eventListener)
    {
        this.eL = eventListener;
    }

    public boolean supportsEvents()
    {
        return true;
    }

    void changePropertiesForABAP_AS(Properties pConProps)
    {
        if(pConProps.getProperty("ACTION").equalsIgnoreCase("CREATE")){
            propertiesTab.put(pConProps.getProperty("jco.client.dest"), pConProps);              
        }
        else if(pConProps.getProperty("ACTION").equalsIgnoreCase("DELETE")){
            propertiesTab.remove(pConProps.getProperty("jco.client.dest"));
        }
    }
}

我使用的是Java 6和JCo3。

关注LStrike

0 个答案:

没有答案