動態jco連接技術實現(SpringBoot連接SAP的RFC)

3 篇文章 0 订阅

背景:因做報表需求,需要從多個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");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值