我目前正在开发一个需要从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