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

问题描述 投票:0回答:1

我目前正在开发一个小型Java应用程序,需要从SAP系统读取一些数据。

几乎一切都工作正常,我可以连接到 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

java jco
1个回答
0
投票

有人可以告诉我该怎么做吗?

你的代码看起来很混乱。为什么不简单地创建两个 Properties 对象,一个包含系统 A 的登录参数,另一个包含系统 B 的登录参数。并且您的 MyDestinationDataProvider.getDestinationProperties() 实现只返回其中一个或另一个,具体取决于目的地名称。 就是这样,一切正常!不需要在运行时动态“改变”某些东西的复杂机制,等等。

© www.soinside.com 2019 - 2024. All rights reserved.