背景:因做報表需求,需要從多個SAP服務器調用RFC來收集數據,傳統jco連接都是自行配置文件注入或固定代碼到配置類,且jco會生成連接文件也不安全。本案例目的在於jco連接及密碼都配置到數據庫里,jco連接放入內存避免產生連接文件。
1.jco下載,并打入本地maven鏡像(請自行百度),然後加入maven依賴
2.jco連接信息表(Oracle)
CREATE TABLE "ERPCENTER"."S_SAP_CONFIG_T"
( "JCO_NAME" VARCHAR2(50 BYTE),
"JCO_PROJECT" VARCHAR2(50 BYTE),
"JCO_CLIENT" VARCHAR2(50 BYTE),
"JCO_USER" VARCHAR2(50 BYTE),
"JCO_PASSWD" VARCHAR2(50 BYTE),
"JCO_LANG" VARCHAR2(50 BYTE),
"JCO_ASHOST" VARCHAR2(50 BYTE),
"JCO_SYSNR" VARCHAR2(50 BYTE),
"JCO_POOL_CAPACITY" NUMBER,
"JCO_PEAK_LIMIT" NUMBER,
"JCO_MAX_GET_TIME" NUMBER,
"CREA_USER" VARCHAR2(50 BYTE),
"CREA_DATE" DATE DEFAULT sysdate,
PRIMARY KEY ("JCO_NAME")
)
3.jco相關代碼及配置
①MyDestinationDataProvider.java
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.springframework.stereotype.Component;
import com.sap.conn.jco.ext.DestinationDataEventListener;
import com.sap.conn.jco.ext.DestinationDataProvider;
@Component
public class MyDestinationDataProvider implements DestinationDataProvider {
private Map<String, Properties> providers = new HashMap<String, Properties>();
public Properties getDestinationProperties(String destName) {
if (destName == null)
{
throw new NullPointerException("請指定目錄名稱");
}
if (providers.size() == 0)
{
return new Properties();
//throw new IllegalStateException("請加入目的連接參數屬性給提供者");
}
return (Properties) providers.get(destName);
}
@Override
public void setDestinationDataEventListener(DestinationDataEventListener listener) {
throw new UnsupportedOperationException();
}
public void addDestinationProperties(String destName, Properties provider) {
providers.put(destName, provider);
}
@Override
public boolean supportsEvents() {
// TODO Auto-generated method stub
return false;
}
}
②JcoConnServiceImpl.java
import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.xxx.provider.user.config.MyDestinationDataProvider;
import com.xxx.provider.user.entity.SSapConfigT;
import com.xxx.provider.user.service.JcoConnService;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.ext.DestinationDataProvider;
import com.sap.conn.jco.ext.Environment;
@Service("jcoConnService")
public class JcoConnServiceImpl implements JcoConnService {
@Autowired
private MyDestinationDataProvider myDestinationDataProvider;
@Override
public JCoDestination getJcoConn(SSapConfigT sc) {
// TODO Auto-generated method stub
Properties connectProperties = new Properties();
JCoDestination dest=null;
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST,sc.getJcoAshost());
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,sc.getJcoSysnr());
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT,sc.getJcoClient());
connectProperties.setProperty(DestinationDataProvider.JCO_USER,sc.getJcoUser());
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD,sc.getJcoPasswd());
connectProperties.setProperty(DestinationDataProvider.JCO_LANG,sc.getJcoLang());
connectProperties.setProperty(DestinationDataProvider.JCO_MAX_GET_TIME,sc.getJcoMaxGetTime().toString());
connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT,sc.getJcoPeakLimit().toString());
connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, sc.getJcoPoolCapacity().toString());
System.out.println("sc.getJcoName():"+sc.getJcoName());
Properties t=myDestinationDataProvider.getDestinationProperties(sc.getJcoName());
if( t==null || t.isEmpty() )
{
myDestinationDataProvider.addDestinationProperties(sc.getJcoName(), connectProperties);
if(Environment.isDestinationDataProviderRegistered()) {
}else {
Environment.registerDestinationDataProvider(myDestinationDataProvider);
}
}
try {
dest = JCoDestinationManager.getDestination(sc.getJcoName());
System.out.println("dest:"+dest);
dest.ping();
System.out.println("sap connection ok");
} catch (JCoException ex) {
System.out.println(ex);
dest=null;
System.out.println("sap connection err");
}
return dest;
}
}
③具體使用案例
SSapConfigT sc=sSapConfigTService.getSapConfigByName("JCO_NAME");
JCoDestination jCoDestination=jcoConnService.getJcoConn(sc);
JCoFunction function = jCoDestination.getRepository().getFunction("RFC_140");