我目前正在开发一个小型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
有人可以告诉我该怎么做吗?
你的代码看起来很混乱。为什么不简单地创建两个 Properties 对象,一个包含系统 A 的登录参数,另一个包含系统 B 的登录参数。并且您的 MyDestinationDataProvider.getDestinationProperties() 实现只返回其中一个或另一个,具体取决于目的地名称。 就是这样,一切正常!不需要在运行时动态“改变”某些东西的复杂机制,等等。