FAQ > 金融建模 > 第三方交互 > 其他

Q:tsl脚本中如何自动切换到有效的天软服务器地址?    

简述
为确保用户能稳定地访问天软服务器,天软提供多条网络链路连接天软服务器,有包括电信,移动,网通等三大主流网络供应商的线路。
当其中一条线路发生故障时,用户可切换其它线路进行使用,不影响用户正常工作。
天软提供的客户端登陆方式中,会进行轮动选择可连接的线路进行登陆,当某条链接异常时,不需要用户主动去切换。
而tsl脚本等其它第三方交互在登陆时没有这个轮动功能,默认情况下,使用的是用户本机DSN分析出来的线路。
所以,当刚好这条线路发生故障时,这类用户就容易出现登陆失败,而客户端登陆正常的现象,这时,就需要用户主动对该服务器线路进行切换。
有时指定的服务器数据未及时更新时也需要切换到其他服务器取数。
本文主要针对指定服务器登陆不上,或者取数异常时轮动到其他服务器取数的方法示例。
  • A:在使用tsl脚本连接天软服务器时,当登陆连接不上服务器,且报服务器没有答复或没有反应的错误时,可轮动所有天软服务器地址进行连接,保证正常登陆后再继续执行。
    天软服务器地址:FAQ:Q:天软服务器地址
    tsl脚本实现多条线路轮动登录天软服务器
    接口使用说明:FAQ:服务器交互函数
    配置
    1、下载已经封装好的tsConnectServer.tsf文件,附件:附件:tsConnectServer.tsf
    2、将文件放在天软客户端安装目录的funcext文件夹下,例如:C:\Program Files\Tinysoft\AnalyseNG.NET\funcext
    3、其他tsl脚本使用tsConnectServer模型登录天软服务器;
    4、配置本地交互模型:FAQ:Q:如何构建定时任务
    tsConnectServer模型说明
    说明:登录天软服务器,当未指定服务器或指定服务器不可用时,轮询其他服务器登录。
    参数
      userID:string,用户名
      password:string,用户密码
      host:string,天软服务器地址,可省略
      port:int,服务器端口,可省略
      ifLD:bool,当服务器已登录时是否强制切换服务器,可省略
    代码详情
    function tsconnectserver(userID,password,host,port,ifLD);
    begin
      c:=checklogined();//登录状态
      if c then
      begin
        echo "天软服务器已登录","\r\n";
        if not ifLD then return 1;
        else
        begin
          disconnectserver();
          echo "断开登录,按指定地址连接登录天软服务器","\r\n";  
        end
      end
      if not host then
      begin 
        //选择有效的天软服务器
        servers := getsysparam("TSDN_tsServerList");
        if ifnil(servers) then servers := tsServerList();
        echo "可选择服务器数量:",length(servers),"\r\n";
        if not length(servers) then
        begin
          echo "所有服务器皆异常,请及时向TSDN人员反馈","\r\n";
          return 0;
        end  
        //轮动天软服务器地址
        for i,server in servers do
        begin
          setsysparam("TSDN_tsServerList",select * from servers where ["IP"]<>server["IP"] end);
          connect :=ConnectServer(server["IP"],server["Port"]); 
          if connect = 0 then
          begin
            echo "天软服务器连接成功,当前服务器:",server["SerName"],"\r\n";
            break;
          end
        end
        if connect <> 0 then
        begin
          echo "天软服务器连接失败,当前服务器:", server["SerName"],"\r\n";
          return 0;
        end
      end
      else
      begin
        lj :=ConnectServer(host,port);// 连接服务器
        if lj=0 then
          echo "天软服务器连接成功,当前为指定服务器IP:", host,"\r\n";
        else
        begin
          echo "天软服务器连接失败,当前为指定服务器IP:", host,"\r\n";
          tsconnectserver(userID,password,0,0,ifLD);
        end
      end
      dl := LoginServer(userID, password,err); // 登陆账号
      if dl = 0 then 
        echo "天软服务器登陆成功","\r\n";
      else
      begin
        echo "天软服务器登陆失败:", tostn(err),"\r\n";
        return 0;
      end
      return 1;
    end

    function tsServerList();
    begin
      serList:=array(
      ("SerName": "深圳新节点", "IP": "sznew.tinysoft.com.cn", "Port": 4433),
      ("SerName": "武汉服务器", "IP": "wh.tinysoft.com.cn", "Port": 443),
      ("SerName": "深圳服务器", "IP": "tsl.tinysoft.com.cn", "Port": 443),
      ("SerName": "深圳服务器-网通", "IP": "211.162.125.187", "Port": 443),
      ("SerName": "深圳服务器-电信", "IP": "220.112.1.175", "Port": 443),
      ("SerName": "深圳服务器-移动", "IP": "183.239.132.134", "Port": 443),
      ("SerName": "深圳新节点-联通", "IP": "112.95.140.61", "Port": 4433),
      ("SerName": "深圳新节点-电信", "IP": "119.147.24.199", "Port": 4433),
      ("SerName": "深圳新节点-移动", "IP": "120.232.255.75", "Port": 4433));
      return serList;
    end

    范例:使用tsl脚本获取A股日线行情,当取数不满足预期时轮动到其他服务器取数
    说明:
    1.在天软服务器中保存取数模型TSDN_getAStocksHQData获取指定日A股日线行情;
    2.在tsl脚本中使用tsconnectserver登录服务器后调用取数模型;
    3.判断取数是否符合预取,比如一天的数据量与代码量差异不超过200,不符合预期时轮询到其他服务器再次取数。
    TSDN_getAStocksHQData代码
    Function TSDN_getAStocksHQData(endt);
    Begin
      //获取指定日A股日线行情
      stocks:=GetAbkbyDate("A股",endt);
      setsysparam(pn_cycle(),cy_day());
      return select * from markettable datekey endt to endt of stocks end;
    End;
    connecttest.tsl脚本
      userid := "user"; // 天软平台账户
      password := "password"; //天软账号密码
      host := "tsl.tinysoft.com.cn"; // 地址
      port := 443; // 端口
      funcname:="TSDN_getAStocksHQData";
      parr:=array(20260114t);
      return TSDN_connectserverTest(funcname,parr,userid,password,host,port);
      
    function TSDN_connectserverTest(funcname,parr,userid,password,host,port);
    begin
      dl:=tsconnectserver(userid,password,host,port,1);//使用配置好的地址登陆
      if not dl then return ;
      echo "执行服务器取数模型 \r\n";
      ret:=TS_ExecServerFun("",funcname,parr,result,retmsg);
      if ret then
      begin
        len:=length(result);
        //当天在市A股共5454个,如果返回数据量与5400差距超过200判定取数异常
        if abs(len-5400)<200 then
        begin
          echo "模型执行成功,取数正常,获取数据量:",len,"\r\n";
          return result;
        end
        else  
        begin
          echo "取数异常,异常数据量:",len,",切换服务器取数","\r\n";
          return TSDN_connectserverTest(funcname,parr,userid,password);
        end

      end
      else
      begin
        echo "执行取数模型失败:",retmsg;
        return 0;
      end
    end

    调用执行结果: