2011年8月18日 星期四

SAP: Destination configuration already initialized

本篇文章的內容無法解決此問題,請參考此篇才有解答


SAP Connector 要使用時要進行初始:

// 1.初始 SAP 連接介面              
RfcDestinationManager.RegisterDestinationConfiguration(new MyBackendConfig());


這個方法在單執行緒中沒有太大的問題,但是搬到 ASP.NET (web)的世界中就麻煩了,
原因是因為這個方法 RegisterDestinationConfiguration 是靜態方法,

在多執行緒的世界中,程式一不小心就會造成執行階段報錯:Destination configuration already initialized
所以要透過 UnregisterDestinationConfiguration 來進行關閉,
但是要呼叫之前一定要確認傳進去的組態參數是同一個,透過此下的程式碼就可以"沒效率"的解決此問題。

為何說沒效率呢?因為每次呼叫RFC 時,都要 Init & Uninit,浪費資源也浪費時間,
但是目前可能這是唯一的解法,若之後有更好的解決方法再另外補充。

public class HuLane
{
RfcDestination m_rfcDest = null;
RfcRepository m_rfcRepo = null;
HLBackendConfig m_Config = null;

public bool InitSAP()
{
bool bRet = false;
try
{
m_Config = new HLBackendConfig();

RfcDestinationManager.RegisterDestinationConfiguration(m_Config);
m_rfcDest = RfcDestinationManager.GetDestination("JTC_000");
m_rfcRepo = m_rfcDest.Repository;

bRet = true;
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(
String.Format("InitSAP(): {0}", ex.Message));
}

return bRet;
}

public bool UninitSAP()
{
bool bRet = false;
try
{
RfcDestinationManager.UnregisterDestinationConfiguration(m_Config);
bRet = true;
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(
String.Format("UninitSAP(): {0}", ex.Message));
}

return bRet;
}
}



參考資料來源連結

3 則留言:

Nasn 提到...

大大你好,我用你的方式試過後,還是出現'SAP.Middleware.Connector.RfcDestinationManager' 的型別初始設定式發生例外狀況,是否哪邊沒設好

Nasn 提到...

RfcConfigParameters parms = new RfcConfigParameters();
parms.Add(RfcConfigParameters.AppServerHost, "10.1.2.156");
parms.Add(RfcConfigParameters.SystemNumber, "00");
parms.Add(RfcConfigParameters.User, "E_HR");
parms.Add(RfcConfigParameters.Password, "201008");
parms.Add(RfcConfigParameters.Client, "100");
parms.Add(RfcConfigParameters.Language, "EN");
parms.Add(RfcConfigParameters.MaxPoolSize, "10");
parms.Add(RfcConfigParameters.IdleTimeout, "5");
以上為我的參數

昭仁 提到...

文章已經更新,請再參考看看吧