这个对访问的C++的命令做过一些封装后,提供给外面的只能做Pool的开发了。这边首先是configuration和connnectionoption要提供给外部做为可以切换的服务器。
而在action返回的回调函数上来切换金正接口。
public static class SZKingdomPool
{
//static List<KCBPConnectionOptions> SZKingdomFactory = new List<KCBPConnectionOptions>();
static SZKingdomPoolConfiguration poolConfiguration = SZKingdomPoolConfiguration.LoadConfiguration();
static Dictionary<int, Dictionary<KCBPConnectionOptions, SZKingdomConfiguration>> SZKingdomFactory = new Dictionary<int, Dictionary<KCBPConnectionOptions, SZKingdomConfiguration>>();
static int ConnectionOptionsIndex = 0;
public static void InitializeSZkongdom()
{
SZKingdomConfiguration Configuration;
for (int i = 0; i < poolConfiguration.Size; i++)
{
Configuration = SZKingdomConfiguration.LoadConfiguration("SZKingdomConfiguration"+i);
KCBPConnectionOptions _connectionOptions = new KCBPConnectionOptions();
Dictionary<KCBPConnectionOptions, SZKingdomConfiguration> collections = new Dictionary<KCBPConnectionOptions, SZKingdomConfiguration>();
_connectionOptions.Address = Configuration.IpAddress;
_connectionOptions.ServerName = Configuration.ServerName;
_connectionOptions.Protocol = Configuration.Protocol;
_connectionOptions.Port = Configuration.Port;
_connectionOptions.SendQName = Configuration.SendQName;
_connectionOptions.ReceiveQName = Configuration.ReceiveQName;
//SZKingdomFactory.Add(_connectionOptions);
collections.Add(_connectionOptions, Configuration);
SZKingdomFactory.Add(i, collections);
}
}
public static Dictionary<KCBPConnectionOptions, SZKingdomConfiguration> GetAvailableSZKingdom()
{
lock (SZKingdomFactory)
{
if (SZKingdomFactory.Count == 0)
{
InitializeSZkongdom();
}
//return SZKingdomFactory[ConnectionOptionsIndex++ % SZKingdomFactory.Count];
return SZKingdomFactory[ConnectionOptionsIndex++ % SZKingdomFactory.Count];
}
}
}
这边是用dictionary的泛型来存放,由于每次去获得金正接口的ip以及服务器信息需要用GetAvailableSZKingdom方法来切换,这边用了取余来不断跳转。
这边是用dictionary的泛型keyvaluepair来foreach出来,再存放到静态的变量里。
public MarketDataLibrary()
{
_wrapper=new KCBPLibraryWrapper();
if (_wrapper.GetConnectionOption().Address== "") {
//_connectionOptions = SZKingdomPool.GetAvailableSZKingdom();
_collections = SZKingdomPool.GetAvailableSZKingdom();
foreach (KeyValuePair<KCBPConnectionOptions, SZKingdomConfiguration> kv in _collections)
{
_connectionOptions = kv.Key;
Configuration = kv.Value;
}
_wrapper.SetConnectionOption(_connectionOptions);
_wrapper.SetCliTimeOut(Configuration.Timeout);
IsConnected = false;
}
}
而在action返回的回调函数上来切换金正接口。
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="csharp">public EntityResponse<DataTable> ExecuteCommand(SZKingdomRequest request, List<SZKingdomArgument> arguments)
{
try
{
EntityResponse<DataTable> result = Retry.Do(() => ExecuteInternal(request, arguments), TimeSpan.FromMilliseconds(10), 1, exception =>
{
_wrapper.Disconnect();
//_connectionOptions = SZKingdomPool.GetAvailableSZKingdom();
//_wrapper.SetConnectionOption(_connectionOptions);
_collections = SZKingdomPool.GetAvailableSZKingdom();
foreach (KeyValuePair<KCBPConnectionOptions, SZKingdomConfiguration> kv in _collections)
{
_connectionOptions = kv.Key;
Configuration = kv.Value;
}
_wrapper.SetConnectionOption(_connectionOptions);
_wrapper.SetCliTimeOut(Configuration.Timeout);
IsConnected = false;
});
return result;
}
catch (AggregateException exception)
{
KCBPLibraryWrapperException inner =
exception.InnerExceptions.OfType<KCBPLibraryWrapperException>().FirstOrDefault();
if (inner == null)
{
throw;
}
throw new Exception("金正服务暂时不可用");
//return EntityResponse<DataTable>.Error(ErrorCode.SZKingdomLibraryError,
// string.Format("KCBP error code: {0}. Message: {1}.", inner.ErrorCode, inner.Message));
}
}