('T2SDKJAVA版开发手册文档版本V1.0发布日期2014-01-10目录目录前言............................................................................................................................................................................I产品简介............................................................................................................................................................I读者对象............................................................................................................................................................I手册概况............................................................................................................................................................I缩略语/术语......................................................................................................................................................II文档版本...........................................................................................................................................................II1开发包简介............................................................................................................................................................11.1发布包说明.................................................................................................................................................11.2版本信息获取..............................................................................................................................................11.3获取方式.....................................................................................................................................................12开发流程................................................................................................................................................................22.1同步开发流程..............................................................................................................................................22.2异步开发流程..............................................................................................................................................33开发接口................................................................................................................................................................43.1配置文件说明..............................................................................................................................................43.1.1performance......................................................................................................................................53.1.2parent.................................................................................................................................................63.1.3limit...................................................................................................................................................63.1.4member.............................................................................................................................................73.1.5SSL(非必配).....................................................................................................................................73.1.6callBackMethods(非必配)................................................................................................................73.1.7logAdapter.........................................................................................................................................83.1.8extCrypt(非必配)..............................................................................................................................83.1.9mdbsupport(非必配).........................................................................................................................83.1.10mc(非必配)................................................................................................................................83.1.11subscriber(非必配)....................................................................................................................93.1.12publisher(非必配)......................................................................................................................9文档版本01()恒生电子股份有限公司研发中心目录3.1.13mclog(非必配)...........................................................................................................................93.2T2SDK服务接口【IT2Services】...........................................................................................................103.2.1T2SDK服务实例化(getInstance)..............................................................................................103.2.2T2SDK服务初始化(init)..........................................................................................................103.2.3重载T2SDK服务初始化(init)..................................................................................................103.2.4T2SDK服务启动(start).............................................................................................................113.2.5T2SDK服务停止(stop).............................................................................................................113.2.6重载T2SDK服务停止(stop)....................................................................................................123.2.7获取上级节点接口(getClient)..................................................................................................123.2.8增加上级服务端接口(appendAParent)....................................................................................133.2.9获取当前所有上级连接信息(getQueryAllConnsCommand)...................................................143.2.10获取对应的配置参数信息(getParametersCommand)............................................................153.2.11获取对应配置文件的名字(getT2sdkConfigString)................................................................163.2.12设置服务对应配置文件的名字(setT2sdkConfigString)........................................................163.3客户端接口【IClient】.............................................................................................................................163.3.1同步发送(sendReceive).............................................................................................................163.3.2异步发送(send).........................................................................................................................183.4异步回调接口【ICallBackMethod】.......................................................................................................193.4.1回调执行接口(execute).............................................................................................................193.5消息事件接口【IEvent】.........................................................................................................................203.5.1构造消息事件实例.........................................................................................................................203.5.2设置事件的服务号(setServiceId).............................................................................................203.5.3设置事件的服务别名(setServiceAlias)....................................................................................213.5.4获取事件的服务号(getServiceId).............................................................................................213.5.5获取事件的服务别名(getServiceAlias)....................................................................................223.5.6设置事件的类型(setEventType)...............................................................................................223.5.7获取事件的类型(getEventType)...............................................................................................223.5.8将请求事件转换为应答事件(changeToresponse)....................................................................233.5.9获取业务数据结果集(getEventDatas)......................................................................................233.5.10添加业务数据结果集(putEventData).....................................................................................233.5.11设置返回码(setReturnCode)...................................................................................................243.5.12获取返回码(getReturnCode)...................................................................................................243.5.13设置错误码(setErrorCode)......................................................................................................253.5.14获取错误码(getErrorNo).........................................................................................................253.5.15获取错误信息(getErrorInfo)...................................................................................................25文档版本01()恒生电子股份有限公司研发中心目录3.5.16获取所有属性的个数(getAttributeCount)..............................................................................263.5.17根据名字获取属性类型(getAttributeName)..........................................................................263.5.18根据名字判断属性是否存在(hasAttribute)...........................................................................273.5.19添加INT类型的属性和值(setIntegerAttributeValue)............................................................273.5.20获取INT类型的属性值(getIntegerAttributeValue)...............................................................273.5.21添加STRING类型的属性和值(setStringAttributeValue)......................................................283.5.22获取STRING类型的属性值(getStringAttributeValue).........................................................283.5.23添加STRING数组类型的属性和值(setStringArrayAttributeValue)....................................293.5.24获取STRING数组类型的属性值(getStringArrayAttributeValue)........................................293.5.25添加BYTE数组类型的属性和值(setByteArrayAttributeValue)...........................................303.5.26获取BYTE数组类型的属性值(getByteArrayAttributeValue)..............................................303.5.27删除指定名字的属性(removeAttribute).................................................................................303.6结果集接口【IDataset】..........................................................................................................................313.6.1域类型和转换.................................................................................................................................313.6.2结果集打包规则.............................................................................................................................323.6.3设置结果集名字(setDatasetName)...........................................................................................333.6.4获取结果集名字(getDatasetName)...........................................................................................333.6.5获取列个数(getColumnCount).................................................................................................333.6.6获取指定列的类型(getColumnType).......................................................................................343.6.7获取列名对应的列索引(findColumn)......................................................................................343.6.8获取列索引对应的列名(getColumnName)..............................................................................353.6.9根据列名获取INT值(getInt)...................................................................................................353.6.10根据列索引获取INT值(getInt).............................................................................................363.6.11根据列名获取INT值并显示指定默认值(getInt)..................................................................363.6.12根据列索引获取INT值并显示指定默认值(getInt)..............................................................363.6.13根据列名获取LONG值(getLong).........................................................................................373.6.14根据列索引获取LONG值(getLong).....................................................................................373.6.15根据列名获取LONG值并显示指定默认值(getLong).........................................................383.6.16根据列索引获取LONG值并显示指定默认值(getLong).....................................................383.6.17根据列名获取DOUBLE值(getDouble).................................................................................393.6.18根据列索引获取DOUBLE值(getDouble).............................................................................393.6.19根据列名获取DOUBLE值并显示指定默认值(getDouble).................................................393.6.20根据列索引获取DOUBLE值并显示指定默认值(getDouble).............................................403.6.21根据列名获取BYTE数组值(getByteArray).........................................................................403.6.22根据列索引获取BYTE数组值(getByteArray).....................................................................41文档版本01()恒生电子股份有限公司研发中心目录3.6.23根据列名获取BYTE数组值并显示指定默认值(getByteArray)..........................................413.6.24根据列索引获取BYTE数组值并显示指定默认值(getByteArray)......................................423.6.25根据列名获取STRING值(getString)....................................................................................423.6.26根据列索引获取STRING值(getString)................................................................................433.6.27根据列名获取STRING值并显示指定默认值(getString).....................................................433.6.28根据列索引获取STRING值并显示指定默认值(getString).................................................433.6.29根据列名获取STRING数组值(getStringArray)...................................................................443.6.30根据列索引获取STRING数组值(getStringArray)...............................................................443.6.31根据列名获取STRING数组值并显示指定默认值(getStringArray)...................................453.6.32根据列索引获取STRING数组值并显示指定默认值(getStringArray)................................453.6.33定位到指定行(locateLine)......................................................................................................463.6.34移动到第一行前一行(beforeFirst).........................................................................................463.6.35判断是否还有下一行(hasNext)..............................................................................................463.6.36移动到下一行(next)................................................................................................................473.6.37根据默认类型新增一列(addColumn)....................................................................................473.6.38根据传入类型新增一列(addColumn)....................................................................................473.6.39根据列名修改列类型(modifyColumnType)...........................................................................483.6.40根据列索引修改列类型(modifyColumnType).......................................................................483.6.41根据列索引添加BYTE数组值(updateByteArray)................................................................493.6.42根据列名添加BYTE数组值(updateByteArray)....................................................................493.6.43根据列索引添加DOUBLE值(updateDouble).......................................................................503.6.44根据列名添加DOUBLE值(updateDouble)...........................................................................503.6.45根据列索引添加INT值(updateInt)........................................................................................513.6.46根据列名添加INT值(updateInt)............................................................................................513.6.47根据列索引添加LONG值(updateLong)...............................................................................523.6.48根据列名添加LONG值(updateLong)...................................................................................523.6.49根据列索引添加STRING值(updateString)...........................................................................533.6.50根据列名添加STRING值(updateString)...............................................................................533.6.51根据列索引添加STRING数组值(updateStringArray)..........................................................543.6.52根据列名添加STRING数组值(updateStringArray).............................................................543.6.53新增一行数据(appendRow)....................................................................................................553.6.54清空所有行(clear)...................................................................................................................553.6.55清空所有行和列(clearAll)......................................................................................................553.6.56MapReader和MapWriter.............................................................................................................563.7结果集集合接口【IDatasets】.................................................................................................................56文档版本01()恒生电子股份有限公司研发中心目录3.7.1添加数据集(putDataset)............................................................................................................563.7.2根据名字获取数据集(getDataset)............................................................................................573.7.3根据索引获取数据集名字(getDatasetName)...........................................................................573.7.4根据索引获取数据集(getDataset)............................................................................................583.7.5获取数据集个数(getDatasetCount)..........................................................................................583.7.6清空所有的数据集(clear).........................................................................................................583.8消息中心服务【MCServers】..................................................................................................................593.8.1MCServers服务初始化(MCInit)..............................................................................................593.8.2MCServers服务摧毁(Destroy).................................................................................................593.8.3获取订阅主题信息(GetTopic)..................................................................................................603.8.4获取订阅者接口(GetSubscriber)..............................................................................................623.8.5获取发布者接口(GetPublisher)................................................................................................623.8.6获取错误信息(GetErrorMsg)....................................................................................................633.9订阅者接口【ISubscriber】.....................................................................................................................633.9.1订阅主题(SubscribeTopic)........................................................................................................633.9.2取消订阅(CancelSubscribeTopic).............................................................................................643.9.3获取已订阅的信息(GetSubcribeTopic)....................................................................................653.10订阅参数对象【MCSubscribeParameter】............................................................................................663.10.1设置主题名字(SetTopicName)...............................................................................................663.10.2添加附加数据(SetAppData)...................................................................................................663.10.3添加过滤字段(SetFilter).........................................................................................................673.10.4追加返回字段(AppendReturnFiled).......................................................................................673.10.5设置补缺标志(SetFromNow).................................................................................................683.10.6设置覆盖标志(SetReplace).....................................................................................................683.10.7设置发送间隔(SetSendInterval).............................................................................................693.10.8获取主题名字(GetTopicName)...............................................................................................693.10.9获取附加数据(GetAppData)...................................................................................................703.10.10获取过滤字段(GetFilter)......................................................................................................703.10.11获取返回字段(GetReturnFiled)............................................................................................703.10.12获取补缺标志(GetFromNow)...............................................................................................703.10.13获取覆盖标志(GetReplace)..................................................................................................713.10.14获取发送间隔(GetSendInterval)...........................................................................................713.11过滤条件接口【MCFilter】...................................................................................................................713.11.1根据过滤字段名字获取对应值(GetFilterValue)....................................................................713.11.2获取过滤条件个数(GetCount)................................................................................................72文档版本01()恒生电子股份有限公司研发中心目录3.11.3添加过滤条件(SetFilter).........................................................................................................723.11.4比较两个过滤条件是否相等(equal).......................................................................................723.12订阅者回调接口【ISubCallback】........................................................................................................733.12.1接收到发布消息的回调(OnReceived)...................................................................................733.12.2接收到踢人消息的回调(OnReceived)...................................................................................733.13发布者接口【IPublisher】.....................................................................................................................743.13.1发布消息(PubMsg).................................................................................................................744示例代码..............................................................................................................................................................754.1配置文件t2sdk-config.xml.......................................................................................................................754.2同步发送代码............................................................................................................................................764.3异步发送代码............................................................................................................................................784.4订阅代码...................................................................................................................................................804.5发布代码...................................................................................................................................................825常见问题..............................................................................................................................................................845.1如何正确初始化JAVAT2SDK?.............................................................................................................845.2T2SDK是线程安全的么?.......................................................................................................................845.3频繁调用T2Services.getInstance().getClient是否会导致对象数量膨胀,是否需要将client单例化?.........................................................................................................................................................................855.4T2Services.getInstance().stop方法在什么时候调用?............................................................................855.5JAVAT2SDK是长连接吗?.....................................................................................................................855.6在网速较慢的场景下(例如ping大于50ms),如何使用JAVAT2SDK?...............................................855.7JAVAT2SDK的调用会阻塞通讯线程么?.............................................................................................855.8使用异步发送方法send,配置的回调ID是否可以定义为任意整数?..............................................86文档版本01()恒生电子股份有限公司研发中心T2SDKJAVA版开发指南前言前言产品简介T2SDKJAVA版主要用于对接各种基于CRES2.0平台搭建的系统,包括两个开发包:\uf06ccom.hundsun.t2sdk-ext-.jar:负责对接CRES2.0,完成同步/异步发包以及接收主推消息的功能,下文简称t2sdk。(表示jar包的版本号,例如1.1.8)\uf06ccom.hundsun.mcsdk-.jar:完成发布订阅的功能,下文简称mcsdk。(表示jar包的版本号,例如1.1.8)读者对象本指南主要适用于以下人员:\uf06cJAVA开发人员,对接基于CRES2.0平台搭建的系统时使用。手册概况本手册各章节内容如下表所示。章节内容Error:Referencesourcenotfound开发包简介介绍开发包支持的系统,获取方式。Error:Referencesourcenotfound开发流程介绍开发的步骤,异步/同步的开发模式。Error:Referencesourcenotfound开发介绍具体开发接口的函数说明。文档版本01(2014-1-10)恒生电子股份有限公司研发中心IT2SDKJAVA版开发指南前言章节内容接口Error:Referencesourcenotfound示例代码介绍开发的demo的实例代码。5常见问题介绍接口调用时禁止的方式。缩略语/术语下面列出了本手册中出现的缩略语和术语。CCRES2.0金融基础件2.0恒生的新一代金融基础件平台,本文档介绍的开发包就是接入此平台的JAVA版本的开发包。下文中的服务端如无特殊说明,均指CRES2.0。MMC2.0消息中心2.0本文档提到的订阅发布接口都是针对消息中心2.0,1.0的订阅发布不能使用该接口,需要自己开发代码。MC1.0消息中心1.0消息中心1.0需要通过业务消息中增加字段来订阅,没有现成的接口调用。mcsdk消息中心2.0开发包负责与消息中心2.0进行订阅发布的开发包。Tt2sdk金融基础件2.0开发包对接CRES2.0的开发包,负责同步/异步发送请求、主推消息接收等。UUFX恒生统一接入系统客户端的统一接入控制系统,基于CRES2.0平台搭建,可以使用T2SDK接入。UF2.0恒生经济运营平台恒生的证券经纪运营平台系统,基于CRES2.0平台搭建,可以使用T2SDK接入。文档版本01(2014-1-10)恒生电子股份有限公司研发中心IIT2SDKJAVA版开发指南前言文档版本版本号日期修改者修改说明V2.020131210许欣芃创建20140318赵真limit配置段中增加属性ufxPassword20140331赵真3.1.9章节完善extCrypt说明20140520赵真SSL配置段添加属性keyManageAlgorithm描述20140604赵真1:修改章节3.1.9extCrypt2:修改回调方法相关内容文档版本01(2014-1-10)恒生电子股份有限公司研发中心IIIT2SDKJAVA版开发指南3开发接口1开发包简介1.1发布包说明名称:com.hundsun.t2sdk-ext-.jarcom.hundsun.mcsdk-.jar开发语言:JAVA支持操作系统:所有支持JAVA虚拟机的操作系统。依赖项:t2sdk需要依赖外部的加密解密JAR包(commons-codec-1.4.jar)以及日志记录的JAR包(dom4j-1.6.1.jar)。mcsdk依赖t2sdk。1.2版本信息获取版本信息的获取方法如下:\uf06c发布包名.jar之前的表示版本号,例如1.1.8。\uf06c通过WINRAR工具,打开JAR包,到META-INF目录下获取MANIFEST.MF文件,用工具打开这个文件,其中的Product-Version列即版本信息。1.3获取方式\uf06c恒生内部的员工,以项目组的形式向研发中心客服申请使用。\uf06c恒生外部开发商,请联系相应恒生项目的接口人获取开发包。文档版本01(2014-1-10)恒生电子股份有限公司研发中心1T2SDKJAVA版开发指南3开发接口2开发流程本章节主要介绍同步和异步两种开发模式的流程。2.1同步开发流程文档版本01(2014-1-10)恒生电子股份有限公司研发中心2T2SDKJAVA版开发指南3开发接口2.2异步开发流程文档版本01(2014-1-10)恒生电子股份有限公司研发中心3T2SDKJAVA版开发指南3开发接口3开发接口本章主要介绍开发包提供的所有接口和函数参数说明。如无特殊说明,接口都是线程安全的。3.1配置文件说明T2SDK的jar包是通过配置文件与上级建立连接的,配置文件的名称默认为t2sdk-config.xml,具体的配置参数说明如下:文档版本01(2014-1-10)恒生电子股份有限公司研发中心4T2SDKJAVA版开发指南3开发接口 //消息中心订阅发布相关的配置 文档版本01(2014-1-10)恒生电子股份有限公司研发中心5T2SDKJAVA版开发指南3开发接口3.1.1performanceperformance是T2SDK的基本属性,也是T2SDK定义的Parent所共有的属性,具体含义如下表所示。属性含义heartbeatTime客户端发起心跳的时间间隔。单位为秒,取值范围(2~120),小于2取2,大于120取120,默认值为5。acquireConnWaitTime从连接池获取可用连接的最大等待时间。单位为毫秒,取值范围(0~5000),默认值为100。registerTimeTCP连接到T2成功注册的最长时间,超过此时间,该连接会被close。单位为秒,取值范围(1~15),默认值为5。reconnInterval客户端连接断开后,再重新建立连接的时间间隔。单位为秒,取值范围(1~60),默认值为3。callBackTime同步发送等待时间。默认值为1000,单位为毫秒。localServerNameT2SDK客户端名称,不同的T2SDK客户端localServerName必须不同。如果该参数不配置,则当作匿名客户端处理,建议一般客户以匿名方式处理。enmCompress是否启用业务包体压缩,包括以下选项:\uf06cfalse:不采用压缩(默认值)\uf06ctrue:采用压缩compressionThreshold压缩阈值,单位为KB,0表示忽略阈值,直接压缩,默认值为0。3.1.2parentparent服务节点描述,每个服务节点可以由一个或多个member组成,每个member以连接池的形式存在。在T2SDK中以IClient的形式对外提供服务。属性含义parentName本节点主动去连接的T2节点名。safeLevel安全级别,支持以下两种级别:\uf06cSSL:安全连接\uf06cNONE:明文noNameConnection是否为无名连接,true表示无名连接,默认为false。文档版本01(2014-1-10)恒生电子股份有限公司研发中心6T2SDKJAVA版开发指南3开发接口3.1.3limitlimit用于描述T2连接的许可证文件,每个服务节点都拥有自己的连接许可证文件。属性含义licenseFile客户端证书。encrypt许可证书加密算法,支持jcc(忽略大小写)和HSBlowfish两种算法。只有指定为jcc,才采用jcc的加密算法,否则采用HSBlowfish算法。ufxPassword该属性非必须。当ufxPassword存在,注册时将ufxPassword打入字段21。3.1.4member服务节点成员描述,每个服务节点可由一个或多个成员组成,以实现集群。每个成员可以通过配置指定连接池的大小。属性含义no成员编号。单个成员时可不填,默认为0;多个成员时,成员编号不能相同。addressIP地址,必填。port监听的端口地址(T2端口),必填。charset采用的编码字符集,可以为空,默认为"utf-8"。poolSize与该组成员节点中每个节点建立的连接个数,可不填,默认值为2,取值范围(1~64),小于1取1,大于64取64。3.1.5ssl(非必配)当parent的safeLevel为SSL时,用于描述SSL详细配置。属性含义protocol协议,默认为SSL。keyCertFile客户端证书路径。keyCertPwd客户端证书口令。keyManageAlgorithm证书算法,取值为IBMX509和SunX509,使用IBM-JDK请配置为IBMX509trustCertFile根证书路径,1.1.6版本后可以不配置。文档版本01(2014-1-10)恒生电子股份有限公司研发中心7T2SDKJAVA版开发指南3开发接口trustCertPwd根证书口令,1.1.6版本后可以不配置。3.1.6pwd(非必配)当parent的safeLevel为PWD时,用于描述PWD详细配置。属性含义clientId指定客户ID。commPwd指定通信密码。3.1.7callBackMethods(非必配)执行IClient.send(异步发送)之后的回调方法定义,通讯线程会根据应答包的sendID来执行对应的回调方法。属性含义id匹配T2PACK中的sendID,-1是消息中心订阅发布功能必须的配置。如果需要订阅发布功能,就必须进行如下配置: 该类在mcsdk中实现。className负责处理的class,该类实现接口ICallBackMethod。注意用户定义的回调id必须为正整数,0和负数被系统保留使用。3.1.8logAdapter日志适配器,该配置指向用户定义的日志输出器,与T2SDK相关的日志信息会通过export方法输出。属性含义className日志适配器类,继承抽象类AbstractLogAdapter。默认日志使用System.out.println输出,建议可以继承AbstractLogAdapter后合并到具体项目的日志中。3.1.9extCrypt(非必配)用户扩展的加密实例,实现类必须继承接口ICrypt。文档版本01(2014-1-10)恒生电子股份有限公司研发中心8T2SDKJAVA版开发指南3开发接口属性含义class用户扩展的加密实例类。1:该属性用以解决恒生密码加密算法,可以通过配置具体的加密实现来使用。版本1.1.12之前首先下载加密库到工程,下载地址ftp://192.168.51.31/History/Patch/patch20130118(T2SDK)/libSecurity.jar从版本1.1.13之后t2sdk的jar包中自带了libSecurity的相关实现,因此无需添加libSecurity.jar2:t2sdk-config.xml中添加配置指向加密库 3:通过T2Service.getCrypt获得ICrypt实例,调用HsPwdEncode(inBytes,outBytes)实现加密4:需要注意的是,不要对空字符串进行加密。对空密码加密本身不会报错,返回\'\\x02\'字符,在java中,会得到字符串"\\u0002",该字符串以字符串形式入参进行T2调用(用打包器打包后解包会有问题,二进制入参没有问题),服务端解包时可能会丢失入参数据。因此使用该函数前要对空字符串进行判断,空字符串不要加密。3.1.10mdbsupport(非必配)支持CRES2.0的内存数据库。属性含义threadCountmdb任务线程池线程个数,默认值为2。queueSizemdb任务线程池队列长度,默认值为30。listener-class用户实现接口com.hundsun.t2sdk.interfaces.core.channel.IMessageHandler的类列表,当mdb类请求到达后会被执行。3.1.11mc(非必配)支持消息中心的配置相关项。属性含义parentName消息中心用到的连接名字,是上面parent节点中配置的一个上级的名字。type消息中心实现的功能,包括以下选项:\uf06c0:订阅&发布(默认值)文档版本01(2014-1-10)恒生电子股份有限公司研发中心9T2SDKJAVA版开发指南3开发接口属性含义\uf06c1:只订阅\uf06c2:只发布cachedir本地消息中心存放缓存消息的目录。inittimeout消息中心初始化需要的最大时间,初始化时消息中心需要和服务端通信。3.1.12subscriber(非必配)构造订阅者的相关配置。属性含义subname订阅者的名字。根据该名字,上层应用可以获取对应的订阅者。subcallback订阅者的回调类配置,由上层自己实现,负责实现订阅回调接口。timeout订阅者创建的超时时间。3.1.13publisher(非必配)构造发布者的相关配置。属性含义pubname发布者的名字,根据该名字,上层应用可以获取对应的发布者。msgCount发布者在发布端缓存的消息个数。isResetNo发布者是否重新开始自己的发布序号。3.1.14mclog(非必配)订阅发布日志存放目录配置。属性含义dir订阅发布过程中,系统发生错误时都会记录日志,每天会生成一个新的文件。文档版本01(2014-1-10)恒生电子股份有限公司研发中心10T2SDKJAVA版开发指南3开发接口3.2T2SDK服务接口【IT2Services】T2SDK服务接口主要用于维护与上级的连接,包括获取连接、发包/收包和最后关闭所有连接等功能。接口需要导入的包信息如下:importcom.hundsun.t2sdk.interfaces;3.2.1T2SDK服务实例化(getInstance)T2SDK服务接口的实例在整个应用中是一个单例,它的实例化代码如下:importcom.hundsun.t2sdk.impl.client.T2Services;IT2ServicessdkServices=T2Services.getInstance();3.2.2T2SDK服务初始化(init)函数原型publicvoidinit()throwsT2SDKException;输入参数无有无异常失败会抛出异常,详细信息可以在异常中获取。用法说明在获取到服务实例后,首先需要调用该函数进行初始化,之后才可以调用其他函数。初始化是按照配置文件进行,配置文件的默认名称是t2sdk-config.xml,也可以调用setT2sdkConfigString设置需要的配置文件。初始化主要进行获取配置中上级连接的信息,并创建对应的IClient实例的工作。注意该函数在整个应用中只可以调用一次,并且不可以多线程调用。3.2.3重载T2SDK服务初始化(init)函数原型publicvoidinit(IConfigurationconfig)throwsT2SDKException;文档版本01(2014-1-10)恒生电子股份有限公司研发中心11T2SDKJAVA版开发指南3开发接口输入参数参数名称参数说明用法IConfigurationconfig配置对象,配置上级连接的信息。输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。用法说明该函数根据传入的配置对象进行初始化是另一种方式的初始化。对象的构造可以调用:DefaultConfigurationHelperconfigHelp=newDefaultConfigurationHelper();IConfigurationconfiguration=configHelp.loadFileToConfiguration(path);注意该函数在整个应用中只可以调用一次,并且不可以多线程调用。3.2.4T2SDK服务启动(start)函数原型publicvoidstart();输入参数无有无异常无用法说明该函数用于启动服务,在服务初始化之后调用。主要功能是开启线程,然后与上级创建连接,使服务可以处于工作状态。注意该函数在整个应用中只可以调用一次,并且不可以多线程调用。文档版本01(2014-1-10)恒生电子股份有限公司研发中心12T2SDKJAVA版开发指南3开发接口3.2.5T2SDK服务停止(stop)函数原型publicvoidstop();输入参数无有无异常无用法说明应用退出之前,可以调用该函数停止服务,以断开与上级的连接,并释放socket连接等资源。服务停止后,如果需要再次运行,则需要重新执行init(),start()方法。注意该函数在整个应用中只可以调用一次,并且不可以多线程调用。该函数在应用程序退出时可以不调用。3.2.6重载T2SDK服务停止(stop)函数原型publicvoidstop(StringparentName);输入参数参数名称参数说明用法StringparentName上级连接名字输入参数有无异常无用法说明该函数用于断开与指定上级的连接。服务停止之后,与该上级的连接都不可以再用。文档版本01(2014-1-10)恒生电子股份有限公司研发中心13T2SDKJAVA版开发指南3开发接口注意该函数在整个应用中只可以调用一次,并且不可以多线程调用。该函数在应用程序退出时可以不调用。3.2.7获取上级节点接口(getClient)该接口用于获取应用待连接的上级服务端节点。一个应用可以配置多个上级服务端,对于这些上级服务端而言,该应用就是这些服务端对应的客户端。针对配置的上级,每个名字都是唯一的,不可以重复。函数原型publicIClientgetClient(StringparentName)throwsT2SDKException;输入参数参数名称参数说明用法StringparentName上级连接名字,配置文件中配置输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。返回成功返回对应上级连接的客户端接口,使用该接口可以与对应的上级服务端通信。下文有该接口的详细说明。用法说明在初始化以及启动服务后,应用层就可以准备业务数据并获取对应服务端的客户端接口,进行数据的收发操作。该接口可以多线程调用。3.2.8增加上级服务端接口(appendAParent)函数原型publicvoidappendAParent(IElementappendAConfig)throwsT2SDKException;输入参数参数名称参数说明用法IElementappendAConfig对应的上级连接的配置信息输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心14T2SDKJAVA版开发指南3开发接口有无异常无用法说明传入配置信息添加parent节点,该方法用于运行中切换或新增Parent。如果传入的配置中parentName已经存在,则覆盖原有节点。该方法一次完成配置加载和启动,无需再执行start进行启动。参数IElement的获取通过下面代码实现:DefaultConfigurationHelperconfigHelp=newDefaultConfigurationHelper();IConfigurationconfiguration=configHelp.loadFileToConfiguration(path);IElementelement=configuration.getRoot().getChild("attribute-1");3.2.9获取当前所有上级连接信息(getQueryAllConnsCommand)函数原型publicIDatasetgetQueryAllConnsCommand();输入参数无有无异常无返回返回当前T2SDK服务中所有的上级连接信息,返回是一个IDataset接口,关于IDataset接口的操作说明,请参见“3.6结果集接口【IDataset】”。用法说明IDataset的返回结果中,结果集名称是allconnections,对应的字段信息描述如下表所示。字段名称类型字段说明remoteNodeName字符串客户端名字,根据该名字可以获取对应服务端的连接。remoteNodeNo整数客户端连接池的编号。connectionNo整数具体的连接编号。remoteCharset字符串连接使用的字符集。status整数连接状态,包括以下状态:\uf06c0:断开文档版本01(2014-1-10)恒生电子股份有限公司研发中心15T2SDKJAVA版开发指南3开发接口字段名称类型字段说明\uf06c1:socket已创建\uf06c2:连接已经注册\uf06c3:连接当前空闲\uf06c4:连接忙碌\uf06c-1:连接错误connectionType整数连接类型:\uf06c0:连接未知节点\uf06c1:连接的是JRES节点address字符串上级的IP地址。port字符串上级的端口。sendPackCount整数连接的发包个数。sendDataSize整数连接的发包总字节数。recvPackCount整数连接的收包个数。recvDataSize整数连接的收包总字节数。lastActiveTime字符串连接上一次活跃时间,时间格式为yyyy-MM-ddHH:mm:ss:SS。lastDisconnTime字符串连接上一次断开时间,时间格式为yyyy-MM-ddHH:mm:ss:SS。lastConnectTime字符串连接上一次重连时间,时间格式为yyyy-MM-ddHH:mm:ss:SS。reconnCount整数连接重连次数。3.2.10获取对应的配置参数信息(getParametersCommand)函数原型publicIDatasetgetParametersCommand();输入参数无返回返回当前T2SDK服务中所有配置信息。用法说明文档版本01(2014-1-10)恒生电子股份有限公司研发中心16T2SDKJAVA版开发指南3开发接口IDataset的返回结果中,对应的字段信息描述如下表所示。字段名称类型字段说明localServiceName字符串作为有名连接时的客户端名字。heartbeatTime字符串心跳间隔时间,单位为秒。callBackTime字符串同步请求应答的超时时间,单位为毫秒。acquireConnWaitTime字符串从连接池获取可用连接的最大等待时间,单位为毫秒。reconnInterval字符串重连的时间间隔,单位为秒。registerTime字符串注册的时间间隔,单位为秒。isDebugMode字符串是否是调试模式,默认为false。3.2.11获取对应配置文件的名字(getT2sdkConfigString)函数原型publicStringgetT2sdkConfigString();输入参数无返回获得t2sdk服务对应的配置文件名及路径。3.2.12设置服务对应配置文件的名字(setT2sdkConfigString)函数原型publicvoidsetT2sdkConfigString(StringconfigString);输入参数参数名称参数说明用法StringconfigString配置文件名以及路径输入参数返回设置t2sdk服务的配置文件名及路径(默认为t2sdk-config.xml),如果要调用该方法重设t2sdk服务的配置名,则需要在init方法前调用。文档版本01(2014-1-10)恒生电子股份有限公司研发中心17T2SDKJAVA版开发指南3开发接口3.3客户端接口【IClient】客户端接口的实例化是通过IT2Services的getClient接口来实现。3.3.1同步发送(sendReceive)函数原型publicIEventsendReceive(IEventevent)throwsT2SDKException;输入参数参数名称参数说明用法IEventevent需要发送的消息接口输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。返回该函数是一个同步等待应答的发送接收函数。成功会返回服务端的应答,以IEvent接口模式返回。这里的同步等待时间是在配置文件中配置的,由performance标签里面的callBackTime参数决定。下面有三个同名重载函数,方便不同场景下使用同步发送。函数原型一publicIEventsendReceive(IEventevent,longwaitTime)throwsT2SDKException;输入参数参数名称参数说明用法IEventevent需要发送的消息接口。输入参数longwaitTime同步的超时等待时间,单位是毫秒。输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。返回与上面函数接口一样,但此函数的超时时间是应用层自己决定的。文档版本01(2014-1-10)恒生电子股份有限公司研发中心18T2SDKJAVA版开发指南3开发接口函数原型二publicIEventsendReceive(MaptagMap,MapdataMap)throwsT2SDKException;输入参数参数名称参数说明用法MaptagMap消息头部字段的map映射表,例如功能号、包类型等信息。输入参数MapdataMap业务具体参数的map映射表,例如,具体的登录功能号里面需要传入的用户名、密码等字段。输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。返回发送的内容换成MAP的格式。但是不可以传入超时时间,通过配置文件决定超时时间。函数原型三publicIEventsendReceive(MaptagMap,MapdataMap,longwaitTime)throwsT2SDKException;输入参数参数名称参数说明用法MaptagMap消息头部字段的map映射表,例如,功能号、包类型等信息。输入参数MapdataMap业务具体参数的map映射表。例如,具体的登录功能号里面需要传入的用户名、密码等字段。输入参数longwaitTime同步的超时等待时间,单位是毫秒。输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。返回发送内容是MAP格式,同时上层可以控制超时时间。3.3.2异步发送(send)函数原型publicvoidsend(IEventevent)throwsT2SDKException;文档版本01(2014-1-10)恒生电子股份有限公司研发中心19T2SDKJAVA版开发指南3开发接口输入参数参数名称参数说明用法IEventevent需要发送的消息接口输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。返回发送成功后立即返回,应答的消息通过回调返回。如果异步发送的请求由应答返回,则需要在请求中增加EventTagdef.TAG_SENDERID,该标识会在应答中返回,就会根据配置里面的类回调,用户定义的回调id必须为正整数,0和负数被系统保留使用。//请求中增加发送者编号event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID,1);client.send(event);对应的配置文件的配置项: 下面是同一个函数的重载,是采用MAP形式传递要发送的数据。建议使用上面的IEvent接口发送函数,因为IEvent接口比较灵活,可以添加任何数据。函数原型publicvoidsend(MaptagMap,MapdataMap)throwsT2SDKException;输入参数参数名称参数说明用法MaptagMap消息头部字段的map映射表,例如功能号、包类型等信息。输入参数MapdataMap业务具体参数的map映射表。例如具体的登录功能号里面需要传入的用户名、密码等字段。输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。返回发送成功后立刻返回,应答的消息通过回调返回。文档版本01(2014-1-10)恒生电子股份有限公司研发中心20T2SDKJAVA版开发指南3开发接口3.4异步回调接口【ICallBackMethod】该接口是IClient接口中异步发送的回调接口,异步发送在函数调用后会立即返回,等服务端应答返回时,就会通过该回调接口返回给上层应用。因此该接口是上层应用自己实现的。3.4.1回调执行接口(execute)函数原型publicvoidexecute(IEventevent,ClientSocketclientSocket);输入参数参数名称参数说明用法IEventevent服务端返回的报文,以IEvent方式返回。回调ClientSocketclientSocket报文来自的套接字,通过该套接字可以直接返回应答。ClientSocket拥有三个方法,其中send方法用做返回报文信息,getEnvironment和getClientEnvironment方法获得T2SDK的公有属性信息和连接属性信息回调用法说明第一个回调返回的是具体的消息,通过IEvent接口解析;第二个回调返回的是报文来自哪个连接,通过ClientSocket的send直接发送相应的应答。类似代码如下:publicclassT2sdkCallbackimplementsICallBackMethod{publicvoidexecute(IEventarg0,ClientSocketarg1){printEvent(arg0);//构造需要回复的IEventeventarg1.send(event);}}3.5消息事件接口【IEvent】该接口负责封装与后台服务通信的消息。后台的消息格式类似于fix的消息,格式大致如下:3=05=1001=1008=…………11=1服务端和客户端已经约定每个数字的特定含义。具体的数字都有常量定义,在com.hundsun.t2sdk.interfaces.share.event.EventTagdef有详细的说明。文档版本01(2014-1-10)恒生电子股份有限公司研发中心21T2SDKJAVA版开发指南3开发接口3.5.1构造消息事件实例一个全新的消息构造如下所示:IEventevent=ContextUtil.getServiceContext().getEventFactory().getEventByAlias("339602",EventType.ET_REQUEST);消息通过工厂获取,获取时需要传入服务的名称以及事件的类型。事件分为四种类型:一般请求ET_REQUEST,一般应答ET_ANSWER,内部请求ET_INTERNAL_REQUEST,内部应答ET_INTERNAL_ANSWER,这些类型的常量定义在com.hundsun.t2sdk.interfaces.share.event.EventType中,根据业务接口需要传入需要的业务类型。获取到消息之后就可以根据具体服务需要的参数,调用下面的接口进行消息封装。3.5.2设置事件的服务号(setServiceId)函数原型voidsetServiceId(StringserviceId);输入参数参数名称参数说明用法StringserviceId服务号输入参数返回无用法说明根据上层应用的需要,设置相应的后台服务的服务号,服务号是后台服务端定义的。3.5.3设置事件的服务别名(setServiceAlias)函数原型voidsetServiceAlias(Stringalias);输入参数参数名称参数说明用法Stringalias服务别名输入参数返回无文档版本01(2014-1-10)恒生电子股份有限公司研发中心22T2SDKJAVA版开发指南3开发接口用法说明服务别名是对应服务号的,是后台服务的另一个称呼。3.5.4获取事件的服务号(getServiceId)函数原型StringgetServiceId()输入参数无返回返回消息中的服务号。3.5.5获取事件的服务别名(getServiceAlias)函数原型StringgetServiceAlias()输入参数无返回返回消息中的服务别名。3.5.6设置事件的类型(setEventType)函数原型voidsetEventType(inttype)输入参数参数名称参数说明用法inttype消息事件的类型输入参数返回无用法说明事件分为四种类型:文档版本01(2014-1-10)恒生电子股份有限公司研发中心23T2SDKJAVA版开发指南3开发接口\uf06c一般请求ET_REQUEST\uf06c一般应答ET_ANSWER\uf06c内部请求ET_INTERNAL_REQUEST\uf06c内部应答ET_INTERNAL_ANSWER这些类型的常量定义在com.hundsun.t2sdk.interfaces.share.event.EventType中。根据业务接口需要传入需要的业务类型。消息类型一般在构造时指定,无需单独调用该接口来指定类型。3.5.7获取事件的类型(getEventType)函数原型intgetEventType();输入参数无返回返回对应的事件类型。3.5.8将请求事件转换为应答事件(changeToresponse)函数原型intchangeToresponse()输入参数无返回转换成功则返回0,转换失败则返回非0。如果已经是应答类事件则返回非0。用法说明将一般请求事件转换为一般应答事件,将内部请求事件转换为内部应答事件。该函数一般在开发服务端程序时调用,收到了一个请求事件并经过处理之后,转成应答事件返回。3.5.9获取业务数据结果集(getEventDatas)函数原型IDatasetsgetEventDatas();输入参数无文档版本01(2014-1-10)恒生电子股份有限公司研发中心24T2SDKJAVA版开发指南3开发接口返回获取消息事件的业务数据集的集合,里面包含多个数据结果集。用法说明该接口一般用于接收服务端返回的应答事件,调用该接口获取服务端的业务应答信息,具体的信息通过IDatasets接口可以获取,IDatasets接口详细说明请参考“3.7结果集集合接口【IDatasets】”。3.5.10添加业务数据结果集(putEventData)函数原型voidputEventData(IDatasetdataset);输入参数参数名称参数说明用法IDatasetdataset业务数据需要传入的结果集数据输入参数返回无用法说明上层应用根据后台服务的要求,组装需要的业务参数数据库集,然后通过该接口设置到消息中,通过消息传递给后台服务处理。如果服务需要添加多个结果集,则需要重复调用该接口。3.5.11设置返回码(setReturnCode)函数原型voidsetReturnCode(intreturnCode);输入参数参数名称参数说明用法intreturnCode返回码输入返回无用法说明文档版本01(2014-1-10)恒生电子股份有限公司研发中心25T2SDKJAVA版开发指南3开发接口返回码用于设置当前消息的处理成功与否,如果上层开发的应用是服务处理端,则通过该函数告知客户端处理的结果,0表示成功,其他值需要设置相应的错误码和错误信息来告知对方具体的错误原因。3.5.12获取返回码(getReturnCode)函数原型intgetReturnCode();输入参数无返回相应的返回码用法说明返回码用于标识业务的处理成功与否,一般返回0表示成功,其他的返回码就需要根据错误码和错误信息来确定具体的错误信息。一般用于上层应用判断返回的应答是成功还是失败。3.5.13设置错误码(setErrorCode)函数原型voidsetErrorCode(StringerrorNo,StringerrorInfo);输入参数参数名称参数说明用法StringerrorNo错误码输入StringerrorInfo错误信息输入返回无用法说明如果作为服务处理端,则通过该函数告知服务发起方相应的处理错误信息。3.5.14获取错误码(getErrorNo)函数原型StringgetErrorNo()文档版本01(2014-1-10)恒生电子股份有限公司研发中心26T2SDKJAVA版开发指南3开发接口输入参数无返回相应的错误码。用法说明如果返回码表示失败,则通过该函数获取相应的错误码,从而获取具体的错误信息。3.5.15获取错误信息(getErrorInfo)函数原型StringgetErrorInfo()输入参数无返回相应的错误信息用法说明如果返回码表示失败,则通过该函数获取相应的错误信息。3.5.16获取所有属性的个数(getAttributeCount)函数原型intgetAttributeCount();输入参数无返回消息事件中属性的个数。用法说明获取之前设置的所有属性的个数。3.5.17根据名字获取属性类型(getAttributeName)函数原型chargetAttributeType(Stringname);文档版本01(2014-1-10)恒生电子股份有限公司研发中心27T2SDKJAVA版开发指南3开发接口输入参数参数名称参数说明用法Stringname属性名字输入参数返回根据属性名返回具体的属性类型。用法说明属性类型主要有整型(’I’)、字符串型(’S’)、二进制数据型(’R’)、字符串数组型(’A’)。3.5.18根据名字判断属性是否存在(hasAttribute)函数原型booleanhasAttribute(StringattrName);输入参数参数名称参数说明用法StringattrName属性名字输入参数返回如果存在,返回true,否则返回false。用法说明根据属性名字判断消息中是否已存在该字段。3.5.19添加INT类型的属性和值(setIntegerAttributeValue)函数原型voidsetIntegerAttributeValue(StringattrName,longvalue);输入参数参数名称参数说明用法StringattrName属性名字输入参数longvalue属性值输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心28T2SDKJAVA版开发指南3开发接口返回无用法说明根据属性名字设置整数类型的属性。如果属性名字已经存在,则覆盖前一个属性,类型采用新的数据。3.5.20获取INT类型的属性值(getIntegerAttributeValue)函数原型longgetIntegerAttributeValue(StringattrName);输入参数参数名称参数说明用法StringattrName属性名字输入参数返回根据属性名返回INT型的属性值,如果属性字段不存在就返回0.用法说明如果原来字段的类型不是整型,则按照整数类型进行强制转换,转换失败返回0。3.5.21添加STRING类型的属性和值(setStringAttributeValue)函数原型voidsetStringAttributeValue(StringattrName,Stringvalue);输入参数参数名称参数说明用法StringattrName属性名字输入参数Stringvalue属性值输入参数返回无文档版本01(2014-1-10)恒生电子股份有限公司研发中心29T2SDKJAVA版开发指南3开发接口用法说明根据属性名设置STRING类型的属性。如果属性名已经存在则覆盖前一个属性,类型采用新的数据。3.5.22获取STRING类型的属性值(getStringAttributeValue)函数原型StringgetStringAttributeValue(StringattrName);输入参数参数名称参数说明用法StringattrName属性名字输入参数返回根据属性名返回STRING类型的属性值,如果属性字段不存在就返回NULL。用法说明如果原来字段的类型不是STRING,则按照STRING类型进行强制转换,转换失败返回NULL。3.5.23添加STRING数组类型的属性和值(setStringArrayAttributeValue)函数原型voidsetStringArrayAttributeValue(StringattrName,String[]value);输入参数参数名称参数说明用法StringattrName属性名字输入参数String[]value属性值输入参数返回无用法说明根据属性名设置String[]类型的属性。如果属性名已经存在则覆盖前一个属性,类型采用新的数据。文档版本01(2014-1-10)恒生电子股份有限公司研发中心30T2SDKJAVA版开发指南3开发接口3.5.24获取STRING数组类型的属性值(getStringArrayAttributeValue)函数原型String[]getStringArrayAttributeValue(StringattrName);输入参数参数名称参数说明用法StringattrName属性名字输入参数返回根据属性名返回对应STRING[]型的属性值,如果属性字段不存在就返回NULL。用法说明如果原来字段的类型不是STRING[]类型,就会按照STRING[]类型进行强制转换,转换失败返回NULL。3.5.25添加BYTE数组类型的属性和值(setByteArrayAttributeValue)函数原型voidsetByteArrayAttributeValue(StringattrName,byte[]value);输入参数参数名称参数说明用法StringattrName属性名字输入参数byte[]value属性值输入参数返回无用法说明根据属性名设置byte[]类型的属性。如果属性名已经存在则覆盖前一个属性,类型采用新的数据。文档版本01(2014-1-10)恒生电子股份有限公司研发中心31T2SDKJAVA版开发指南3开发接口3.5.26获取BYTE数组类型的属性值(getByteArrayAttributeValue)函数原型byte[]getByteArrayAttributeValue(StringattrName);输入参数参数名称参数说明用法StringattrName属性名字输入参数返回对应属性名字的byte[]值,如果属性字段不存在则返回NULL.用法说明如果原来字段的类型不是byte[]类型,就会按照byte[]类型进行强制转换,转换失败返回NULL。3.5.27删除指定名字的属性(removeAttribute)函数原型voidremoveAttribute(Stringname);输入参数参数名称参数说明用法Stringname属性名字输入参数返回无用法说明删除消息中不需要的属性字段。文档版本01(2014-1-10)恒生电子股份有限公司研发中心32T2SDKJAVA版开发指南3开发接口3.6结果集接口【IDataset】IDataset是进行数据传输的基础数据结构,是一个二维表结构,表头为域名(或称字段名、字段域名)。IDataset可以有多行,每行的每个字段值就是相应域的值。可以认为IDataset是由一个或者多个KEY完全一样的map组成,每一个map对应IDataset的一行。IDataset可以通过名字和索引两种方式访问行信息;名字就是列名,索引就是列索引,从1开始。表头除了定义字段域的名字之外,还定义了该列数据的类型。注意IDataSet的行和列都是从1开始。3.6.1域类型和转换域类型用于定义某一列数据的数据类型,但并未规定该列中所有的数据必须是这个类型。例如,IDataset某一列的域类型为整型,但是该列中有一个值为字符串"123",则认为该值也是有效的,因为在获取该值时,IDataset会做尽力转换,将字符串"123"转换为整数123返回。IDataset支持的数据类型包括如下:文档版本01(2014-1-10)恒生电子股份有限公司研发中心33T2SDKJAVA版开发指南3开发接口说明表中的obj,表示IDataset中的值;上表说明了如果当前值的类型是“兼容类型”,则要采用“Type”所指定的类型来获取,返回的值为“转换后的值”。上表中,未出现的转换映射被视为“无法转换”。3.6.2结果集打包规则首先需要构造一个全新的结果集,构造代码如下:IDatasetdataset=DatasetService.getDefaultInstance().getDataset();有了结果集对象之后,接着添加列和行的数据。添加行列数据有顺序要求,必须先添加列数据再添加行数据,行与行之间需要通过appendRow显式说明,如下代码所示://添加列dataset.addColumn("identity_type");dataset.addColumn("op_branch_no");dataset.addColumn("op_entrust_way");dataset.addColumn("op_station");//添加第一行dataset.appendRow();文档版本01(2014-1-10)恒生电子股份有限公司研发中心34T2SDKJAVA版开发指南3开发接口dataset.updateString("identity_type","");dataset.updateString("op_branch_no","");dataset.updateString("op_entrust_way","7");//添加第二行dataset.appendRow();dataset.updateString("identity_type","");dataset.updateString("op_branch_no","");dataset.updateString("op_entrust_way","7");3.6.3设置结果集名字(setDatasetName)函数原型voidsetDatasetName(Stringname);输入参数参数名称参数说明用法Stringname结果集名字输入参数返回无用法说明设置当前结果集的名字,服务端可以根据设置的名字获取对应的结果集。结果集有默认名字PLATFORM_DEFAULT_DATASET_NAME。如果一个IDAtasets里面有多个同名的结果集,则根据名字获取结果集就会出现问题。3.6.4获取结果集名字(getDatasetName)函数原型StringgetDatasetName();输入参数无返回当前结果集已经设定的名字。文档版本01(2014-1-10)恒生电子股份有限公司研发中心35T2SDKJAVA版开发指南3开发接口3.6.5获取列个数(getColumnCount)函数原型intgetColumnCount();输入参数无返回返回当前结果集中列的个数。3.6.6获取指定列的类型(getColumnType)函数原型chargetColumnType(intcolumn);输入参数参数名称参数说明用法intcolumn列的索引输入参数返回返回对应索引的列类型。用法说明索引是从1开始,因此第一列应该传入索引值1,不是0。如果列索引无效,就返回DatasetColumnType.DS_UNKNOWN。具体的类型如下表所示。列类型常量定义字符未知类型DatasetColumnType.DS_UNKNOWN‘N’整型DatasetColumnType.DS_INT\'I\'长整形DatasetColumnType.DS_LONG\'L\'二进制DatasetColumnType.DS_BYTE_ARRAY\'R\'长浮点型DatasetColumnType.DS_DOUBLE\'D\'字符串类型DatasetColumnType.DS_STRING\'S\'字符串数组DatasetColumnType.DS_STRING_ARRAY\'A\'文档版本01(2014-1-10)恒生电子股份有限公司研发中心36T2SDKJAVA版开发指南3开发接口3.6.7获取列名对应的列索引(findColumn)函数原型intfindColumn(StringcolumnName);输入参数参数名称参数说明用法StringcolumnName列名输入参数返回返回列名的索引。如果不存在,就返回0。3.6.8获取列索引对应的列名(getColumnName)函数原型StringgetColumnName(intcolumn);输入参数参数名称参数说明用法intcolumn列的索引输入参数返回返回对应列索引的列名。索引无效就返回NULL。3.6.9根据列名获取INT值(getInt)函数原型intgetInt(StringcolumnName);输入参数参数名称参数说明用法StringcolumnName列名输入参数返回根据列名返回对应的INT类型的值。文档版本01(2014-1-10)恒生电子股份有限公司研发中心37T2SDKJAVA版开发指南3开发接口用法说明指针不在有效行中或者columnName列名不存在,就会获取失败,返回默认值0。如果需要判断该返回值是默认值还是真实值,可以先调用findColumn确定列是否存在。如果列类型不是INT的,会进行转换,转换规则参见“3.6.1域类型和转换”中所示。3.6.10根据列索引获取INT值(getInt)函数原型intgetInt(intcolumnIndex);输入参数参数名称参数说明用法intcolumnIndex列索引输入参数返回根据列索引返回对应列数据,按照INT类型返回。用法说明如果列索引无效,就返回默认值0。类型不匹配的话,就做相应的转换。3.6.11根据列名获取INT值并显示指定默认值(getInt)函数原型intgetInt(StringcolumnName,intdef);输入参数参数名称参数说明用法StringcolumnName列名输入参数intdef默认值输入参数返回根据列名返回对应的INT类型的值。用法说明指针不在有效行上或者columnName列名不存在,就会获取失败,返回的默认值是按照传入的默认值参数返回。类型不匹配的话,就做相应的转换。文档版本01(2014-1-10)恒生电子股份有限公司研发中心38T2SDKJAVA版开发指南3开发接口3.6.12根据列索引获取INT值并显示指定默认值(getInt)函数原型intgetInt(intcolumnIndex,intdef);输入参数参数名称参数说明用法intcolumnIndex列索引输入参数intdef默认值输入参数返回根据列索引返回对应的INT类型的值。用法说明如果列索引不合法,返回的默认值是按照传入的默认值参数返回。类型不匹配的话,就做相应的转换。3.6.13根据列名获取LONG值(getLong)函数原型longgetLong(StringcolumnName);输入参数参数名称参数说明用法StringcolumnName列名输入参数返回根据列名返回对应的LONG类型的值。用法说明指针不在有效行上或者columnName列名不存在,就会获取失败,返回默认值0。类型不匹配的话,就做相应的转换。3.6.14根据列索引获取LONG值(getLong)函数原型文档版本01(2014-1-10)恒生电子股份有限公司研发中心39T2SDKJAVA版开发指南3开发接口longgetLong(intcolumnIndex);输入参数参数名称参数说明用法intcolumnIndex列索引输入参数返回根据列索引返回对应列数据,按照LONG类型返回。用法说明如果列索引无效,就返回默认值0。如果类型不匹配,就做相应的转换。3.6.15根据列名获取LONG值并显示指定默认值(getLong)函数原型longgetLong(StringcolumnName,longdef);输入参数参数名称参数说明用法StringcolumnName列名输入参数longdef默认值输入参数返回根据列名返回对应的值,用LONG类型返回。用法说明指针不在有效行上或者columnName列名不存在,就会获取失败,返回的默认值是按照传入的默认值参数返回。如果类型不匹配,就做相应的转换。3.6.16根据列索引获取LONG值并显示指定默认值(getLong)函数原型intgetInt(intcolumnIndex,intdef);输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心40T2SDKJAVA版开发指南3开发接口参数名称参数说明用法intcolumnIndex列索引输入参数longdef默认值输入参数返回根据列索引返回对应的值,用LONG类型返回。用法说明如果列索引不合法,返回的默认值是按照传入的默认值参数返回。如果类型不匹配,就做相应的转换。3.6.17根据列名获取DOUBLE值(getDouble)函数原型doublegetDouble(StringcolumnName);输入参数参数名称参数说明用法StringcolumnName列名输入参数返回根据列名返回对应的值,用DOUBLE类型返回。用法说明指针不在有效行上或者columnName列名不存在,就会获取失败,返回默认值0。如果类型不匹配,就做相应的转换。3.6.18根据列索引获取DOUBLE值(getDouble)函数原型doublegetDouble(intcolumnIndex);输入参数参数名称参数说明用法intcolumnIndex列索引输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心41T2SDKJAVA版开发指南3开发接口返回根据列索引返回对应列数据,按照DOUBLE类型返回。用法说明如果列索引无效,就返回默认值0。如果类型不匹配,就做相应的转换。3.6.19根据列名获取DOUBLE值并显示指定默认值(getDouble)函数原型doublegetDouble(StringcolumnName,doubledef);输入参数参数名称参数说明用法StringcolumnName列名输入参数doubledef默认值输入参数返回根据列名返回对应的值,用DOUBLE类型返回。用法说明指针不在有效行上或者columnName列名不存在,就会获取失败,返回的默认值是按照传入的默认值参数返回。如果类型不匹配,就做相应的转换。3.6.20根据列索引获取DOUBLE值并显示指定默认值(getDouble)函数原型doublegetDouble(intcolumnIndex,doubledef);输入参数参数名称参数说明用法intcolumnIndex列索引输入参数doubledef默认值输入参数返回根据列索引返回对应的值,用DOUBLE类型返回。文档版本01(2014-1-10)恒生电子股份有限公司研发中心42T2SDKJAVA版开发指南3开发接口用法说明如果列索引不合法,返回的默认值是按照传入的默认值参数返回。如果类型不匹配,就做相应的转换。3.6.21根据列名获取BYTE数组值(getByteArray)函数原型byte[]getByteArray(StringcolumnName);输入参数参数名称参数说明用法StringcolumnName列名输入参数返回根据列名返回对应的值,用BYTE数组类型返回。用法说明指针不在有效行上或者columnName列名不存在,就会获取失败,返回默认值(newbyte[0])。如果类型不匹配,就做相应的转换。3.6.22根据列索引获取BYTE数组值(getByteArray)函数原型byte[]getByteArray(intcolumnIndex);输入参数参数名称参数说明用法intcolumnIndex列索引输入参数返回根据列索引返回对应列数据,按照BYTE数组类型返回。用法说明如果列索引无效,就返回默认值(newbyte[0])。如果类型不匹配,就做相应的转换。文档版本01(2014-1-10)恒生电子股份有限公司研发中心43T2SDKJAVA版开发指南3开发接口3.6.23根据列名获取BYTE数组值并显示指定默认值(getByteArray)函数原型byte[]getByteArray(StringcolumnName,byte[]def);输入参数参数名称参数说明用法StringcolumnName列名输入参数byte[]def默认值输入参数返回根据列名返回对应的值,用BYTE数组类型返回。用法说明指针不在有效行上或者columnName列名不存在,就会获取失败,返回的默认值是按照传入的默认值参数返回。如果类型不匹配,就做相应的转换。3.6.24根据列索引获取BYTE数组值并显示指定默认值(getByteArray)函数原型byte[]getByteArray(intcolumnIndex,byte[]def);输入参数参数名称参数说明用法intcolumnIndex列索引输入参数doubledef默认值输入参数返回根据列索引返回对应的值,返回值类型为BYTE数组类型。用法说明如果列索引不合法,返回的默认值是按照传入的默认值参数返回。如果类型不匹配,就做相应的转换。文档版本01(2014-1-10)恒生电子股份有限公司研发中心44T2SDKJAVA版开发指南3开发接口3.6.25根据列名获取STRING值(getString)函数原型StringgetString(StringcolumnName);输入参数参数名称参数说明用法StringcolumnName列名输入参数返回根据列名返回对应的值,返回值类型为STRING类型。用法说明指针不在有效行上或者columnName列名不存在,就会获取失败,返回默认值(“”)。如果类型不匹配,就做相应的转换。3.6.26根据列索引获取STRING值(getString)函数原型StringgetString(intcolumnIndex);输入参数参数名称参数说明用法intcolumnIndex列索引输入参数返回根据列索引返回对应列的数据,返回值类型为STRING类型。用法说明如果列索引无效,就返回默认值(“”)。如果类型不匹配,就做相应的转换。3.6.27根据列名获取STRING值并显示指定默认值(getString)函数原型StringgetString(StringcolumnName,Stringdef);文档版本01(2014-1-10)恒生电子股份有限公司研发中心45T2SDKJAVA版开发指南3开发接口输入参数参数名称参数说明用法StringcolumnName列名输入参数Stringdef默认值输入参数返回根据列名返回对应的值,返回值类型为STRING类型。用法说明指针不在有效行上或者columnName列名不存在,就会获取失败,返回的默认值是按照传入的默认值参数返回。如果类型不匹配,就做相应的转换。3.6.28根据列索引获取STRING值并显示指定默认值(getString)函数原型StringgetString(intcolumnIndex,Stringdef);输入参数参数名称参数说明用法intcolumnIndex列索引输入参数Stringdef默认值输入参数返回根据列索引返回对应的值,返回值类型为STRING类型。用法说明如果列索引不合法,返回的默认值是按照传入的默认值参数返回。如果类型不匹配,就做相应的转换。3.6.29根据列名获取STRING数组值(getStringArray)函数原型String[]getStringArray(StringcolumnName);输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心46T2SDKJAVA版开发指南3开发接口参数名称参数说明用法StringcolumnName列名输入参数返回根据列名返回对应的值,按照STRING数组类型返回。用法说明指针不在有效行上或者columnName列名不存在,就会获取失败,返回默认值(newString[0])。类型不匹配的话,就做相应的转换。3.6.30根据列索引获取STRING数组值(getStringArray)函数原型String[]getStringArray(intcolumnIndex);输入参数参数名称参数说明用法intcolumnIndex列索引输入参数返回根据列索引返回对应列数据,按照STRING数组类型返回。用法说明如果列索引无效,就返回默认值(newString[0])。如果类型不匹配,就做相应的转换。3.6.31根据列名获取STRING数组值并显示指定默认值(getStringArray)函数原型String[]getStringArray(StringcolumnName,String[]def);输入参数参数名称参数说明用法StringcolumnName列名输入参数String[]def默认值输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心47T2SDKJAVA版开发指南3开发接口返回根据列名返回对应的值,按照STRING数组类型返回。用法说明指针不在有效行上或者columnName列名不存在,就会获取失败,返回的默认值是按照传入的默认值参数返回。如果类型不匹配,就做相应的转换。3.6.32根据列索引获取STRING数组值并显示指定默认值(getStringArray)函数原型String[]getStringArray(intcolumnIndex,String[]def);输入参数参数名称参数说明用法intcolumnIndex列索引输入参数Stringdef默认值输入参数返回根据列索引返回对应的值,按照STRING数组类型返回。用法说明如果列索引不合法,返回的默认值是按照传入的默认值参数返回。如果类型不匹配,就做相应的转换。3.6.33定位到指定行(locateLine)函数原型voidlocateLine(intlineIndex);输入参数参数名称参数说明用法intlineIndex行索引输入参数返回无用法说明文档版本01(2014-1-10)恒生电子股份有限公司研发中心48T2SDKJAVA版开发指南3开发接口把结果集当前指针指向指定的行,行索引从1开始,如果行索引不正确就会抛出异常DatasetRuntimeException。3.6.34移动到第一行前一行(beforeFirst)函数原型voidbeforeFirst();输入参数无返回无用法说明把结果集当前指针移动到第一行前一行,一般用于开始遍历之前,把当前行指到第一行的前一行。3.6.35判断是否还有下一行(hasNext)函数原型booleanhasNext();输入参数无返回如果有下一行数据,就返回true,如果没有就返回false。用法说明一般用于遍历过程中,判断是否有下一行,然后执行next函数,获取下一行。3.6.36移动到下一行(next)函数原型voidnext();输入参数无返回文档版本01(2014-1-10)恒生电子股份有限公司研发中心49T2SDKJAVA版开发指南3开发接口无用法说明将指针从当前位置下移一行。DataSet指针最初位于第一行之前,第一次调用next方法使第一行成为当前行,第二次调用使第二行成为当前行,以此类推。调用此方法不能保证每次都成功,为避免失败,建议先调用hasNext()。3.6.37根据默认类型新增一列(addColumn)函数原型voidaddColumn(StringcolName);输入参数参数名称参数说明用法StringcolName列名输入参数返回无用法说明根据列名添加一个新的列,该列采用默认类型STRING类型。如果已经存在该列名,则覆盖。3.6.38根据传入类型新增一列(addColumn)函数原型voidaddColumn(StringcolName,inttype);输入参数参数名称参数说明用法StringcolName列名输入参数inttype列类型输入参数返回无用法说明根据传入的列类型和名字,添加一个新的列。如果已经存在该列名,则覆盖。文档版本01(2014-1-10)恒生电子股份有限公司研发中心50T2SDKJAVA版开发指南3开发接口3.6.39根据列名修改列类型(modifyColumnType)函数原型voidmodifyColumnType(StringcolName,inttype)throwsDatasetRuntimeException;输入参数参数名称参数说明用法StringcolName列名输入参数inttype列类型输入参数返回无用法说明修改指定名字对应的列的类型,只是修改列的类型,列本身已有的行数据不会更改。如果传入的列名不存在或者传入的类型无效,就会抛出异常。3.6.40根据列索引修改列类型(modifyColumnType)函数原型voidmodifyColumnType(intcolIndex,inttype)throwsDatasetRuntimeException;输入参数参数名称参数说明用法intcolIndex列索引输入参数inttype列类型输入参数返回无用法说明修改指定索引列的类型,只是修改列的类型,列本身已有的行数据不会更改。如果传入的列名不存在、列类型不匹配或者传入的类型无效,就会抛出异常。文档版本01(2014-1-10)恒生电子股份有限公司研发中心51T2SDKJAVA版开发指南3开发接口3.6.41根据列索引添加BYTE数组值(updateByteArray)函数原型publicvoidupdateByteArray(intcolumnIndex,byte[]v)throwsDatasetRuntimeException;输入参数参数名称参数说明用法intcolumnIndex列索引输入参数byte[]v数据值输入参数返回无用法说明在当前行上增加对应索引列的数据,根据传入的数据填入。索引从1开始,如果列索引超出范围、列类型不匹配或者指针不在有效行上,就抛出异常。3.6.42根据列名添加BYTE数组值(updateByteArray)函数原型publicvoidupdateByteArray(StringcolumnName,byte[]v)throwsDatasetRuntimeException;输入参数参数名称参数说明用法StringcolumnName列名输入参数byte[]v数据值输入参数返回无用法说明在当前行上增加对应名字列的数据,根据传入的数据填入。如果列名不存在、列类型不匹配或者指针不在有效行上,就抛出异常。文档版本01(2014-1-10)恒生电子股份有限公司研发中心52T2SDKJAVA版开发指南3开发接口3.6.43根据列索引添加DOUBLE值(updateDouble)函数原型publicvoidupdateDouble(intcolumnIndex,doublev)throwsDatasetRuntimeException;输入参数参数名称参数说明用法intcolumnIndex列索引输入参数doublev数据值输入参数返回无用法说明在当前行上增加对应索引列的数据,根据传入的数据填入。索引从1开始,如果列索引超出范围、列类型不匹配或者指针不在有效行上,就抛出异常。3.6.44根据列名添加DOUBLE值(updateDouble)函数原型publicvoidupdateDouble(StringcolumnName,doublev)throwsDatasetRuntimeException;输入参数参数名称参数说明用法StringcolumnName列名输入参数doublev数据值输入参数返回无用法说明在当前行上增加对应名字列的数据,根据传入的数据填入。如果列名不存在,列类型不匹配,或者指针不在有效行上,就抛出异常。文档版本01(2014-1-10)恒生电子股份有限公司研发中心53T2SDKJAVA版开发指南3开发接口3.6.45根据列索引添加INT值(updateInt)函数原型publicvoidupdateInt(intcolumnIndex,intv)throwsDatasetRuntimeException;输入参数参数名称参数说明用法intcolumnIndex列索引输入参数intv数据值输入参数返回无用法说明在当前行上增加对应索引列的数据,根据传入的数据填入。索引从1开始,如果列索引超出范围、列类型不匹配或者指针不在有效行上,就抛出异常。3.6.46根据列名添加INT值(updateInt)函数原型publicvoidupdateInt(StringcolumnName,intv)throwsDatasetRuntimeException;输入参数参数名称参数说明用法StringcolumnName列名输入参数intv数据值输入参数返回无用法说明在当前行上增加对应名字列的数据,根据传入的数据填入。如果列名不存在、列类型不匹配或者指针不在有效行上,就抛出异常。文档版本01(2014-1-10)恒生电子股份有限公司研发中心54T2SDKJAVA版开发指南3开发接口3.6.47根据列索引添加LONG值(updateLong)函数原型publicvoidupdateLong(intcolumnIndex,longv)throwsDatasetRuntimeException;输入参数参数名称参数说明用法intcolumnIndex列索引输入参数longv数据值输入参数返回无用法说明在当前行上增加对应索引列的数据,根据传入的数据填入。索引从1开始,如果列索引超出范围、列类型不匹配或者指针不在有效行上,就抛出异常。3.6.48根据列名添加LONG值(updateLong)函数原型publicvoidupdateLong(StringcolumnName,longv)throwsDatasetRuntimeException;输入参数参数名称参数说明用法StringcolumnName列名输入参数longv数据值输入参数返回无用法说明在当前行上增加对应名字列的数据,根据传入的数据填入。如果列名不存在、列类型不匹配或者指针不在有效行上,就抛出异常。文档版本01(2014-1-10)恒生电子股份有限公司研发中心55T2SDKJAVA版开发指南3开发接口3.6.49根据列索引添加STRING值(updateString)函数原型publicvoidupdateString(intcolumnIndex,Stringv)throwsDatasetRuntimeException;输入参数参数名称参数说明用法intcolumnIndex列索引输入参数Stringv数据值输入参数返回无用法说明在当前行上增加对应索引列的数据,根据传入的数据填入。索引从1开始,如果列索引超出范围、列类型不匹配或者指针不在有效行上,就抛出异常。3.6.50根据列名添加STRING值(updateString)函数原型publicvoidupdateString(StringcolumnName,Stringv)throwsDatasetRuntimeException;输入参数参数名称参数说明用法StringcolumnName列名输入参数Stringv数据值输入参数返回无用法说明在当前行上增加对应名字列的数据,根据传入的数据填入。如果列名不存在、列类型不匹配或者指针不在有效行上,就抛出异常。文档版本01(2014-1-10)恒生电子股份有限公司研发中心56T2SDKJAVA版开发指南3开发接口3.6.51根据列索引添加STRING数组值(updateStringArray)函数原型publicvoidupdateStringArray(intcolumnIndex,String[]v)throwsDatasetRuntimeException;输入参数参数名称参数说明用法intcolumnIndex列索引输入参数String[]v数据值输入参数返回无用法说明在当前行上增加对应索引列的数据,根据传入的数据填入。索引从1开始,如果列索引超出范围、列类型不匹配或者指针不在有效行上,就抛出异常。3.6.52根据列名添加STRING数组值(updateStringArray)函数原型publicvoidupdateStringArray(StringcolumnName,String[]v)throwsDatasetRuntimeException;输入参数参数名称参数说明用法StringcolumnName列名输入参数String[]v数据值输入参数返回无用法说明在当前行上增加对应名字列的数据,根据传入的数据填入。如果列名不存在、列类型不匹配或者指针不在有效行上,就抛出异常。文档版本01(2014-1-10)恒生电子股份有限公司研发中心57T2SDKJAVA版开发指南3开发接口3.6.53新增一行数据(appendRow)函数原型publicbooleanappendRow();输入参数无返回添加行成功返回true,否则返回false。用法说明添加一行数据之前,必须调用该接口,调用之后才可以使用update方法把数据添加到这一行,一行添加完成后,添加下一行之前需要再次调用该方法。第一行数据添加之前也需要调用该函数,即在addColumn所有列添加成功之后,需要先调用该函数,才可以添加数据到第一行。3.6.54清空所有行(clear)函数原型voidclear();输入参数无返回无用法说明清除所有的行数据,列信息会保留,可以再次新增行数据。3.6.55清空所有行和列(clearAll)函数原型voidclearAll();输入参数无返回无文档版本01(2014-1-10)恒生电子股份有限公司研发中心58T2SDKJAVA版开发指南3开发接口用法说明清除所有的列信息和行数据,清除之后,可以重新添加列和行数据。3.6.56MapReader和MapWriter为简化多/单行数据集操作,提供了工具类MapWriter和MapReader,可以像java.util.Map一样读或写Idataset。MapWritermw=newMapWriter();mw.put("1",11);mw.put("2","22");mw.put("3",33.3);mw.put("4",newbyte[]{\'4\',\'4\',\'4\',\'4\'});mw.put("5",newString[]{"5","5","5","5"});mw.put("6",newCharacter(\'A\'));IDatasetds=mw.getDataset();//获取相应的IDataset实例,并且保持字段存放次序MapReadermr=newMapReader(ds);System.out.println(mr.getString("1"));System.out.println(mr.getString("2"));System.out.println(mr.getString("3"));System.out.println(mr.getString("4"));System.out.println(mr.getStringArray("5"));System.out.println(mr.getString("6"));System.out.println(mr.getInt("3"));System.out.println(mr.getDouble("7",333));//如果获取字段"7"失败,则采用默认值333说明上面的两个工具类不保证线程安全。对于MapReader,如果出现传入的ds为空或者要获取的字段不存在等获取失败的情况,则返回默认值。3.7结果集集合接口【IDatasets】3.7.1添加数据集(putDataset)函数原型voidputDataset(IDatasetdataset)throwsDatasetRuntimeException;输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心59T2SDKJAVA版开发指南3开发接口参数名称参数说明用法IDatasetdataset数据结果集输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。返回无用法说明在数据集集合中添加一个新的结果,如果数据集的名字重复,后者将会覆盖前者。最多只能有一个数据集没有指定名字,尝试去存放两个无名的数据集,会抛出运行时异常。3.7.2根据名字获取数据集(getDataset)函数原型IDatasetgetDataset(Stringname);输入参数参数名称参数说明用法Stringname数据结果集名字输入参数返回对应名字的结果集存在,就返回对应结果集,如果不存在返回NULL。用法说明根据名字获取对应的结果集。3.7.3根据索引获取数据集名字(getDatasetName)函数原型StringgetDatasetName(intindex);输入参数参数名称参数说明用法intindex结果集对应的下标输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心60T2SDKJAVA版开发指南3开发接口返回对应结果集的名字,没有则返回NULL。用法说明结果集下标从0开始,上限是结果集个数。3.7.4根据索引获取数据集(getDataset)函数原型IDatasetgetDataset(intindex);输入参数参数名称参数说明用法intindex结果集对应的下标输入参数返回根据下标获取对应的结果集,没有则返回NULL。用法说明结果集下标从0开始,上限是结果集个数。3.7.5获取数据集个数(getDatasetCount)函数原型intgetDatasetCount();输入参数无返回获取结果集集合中的结果集个数。3.7.6清空所有的数据集(clear)函数原型voidclear();输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心61T2SDKJAVA版开发指南3开发接口无返回无用法说明清空当前集合中的所有结果集。3.8消息中心服务【MCServers】通过MCServers类的静态方法,可以完成订阅发布服务初始化、订阅发布服务停止摧毁、获取主题、获取订阅者和获取发布者等功能。3.8.1MCServers服务初始化(MCInit)函数原型publicstaticvoidMCInit()throwsT2SDKException,MCException输入参数无有无异常失败会抛出异常,详细信息可以在异常中获取。返回无用法说明初始化主要是根据配置文件里的相关参数获取订阅发布服务需要使用的连接,然后根据订阅者名字,发布者名字和回调参数等初始化订阅者和发布者。初始化时会从服务端获取主题,如果主题获取失败,就会返回错误。3.8.2MCServers服务摧毁(Destroy)函数原型publicstaticvoidDestroy()输入参数无文档版本01(2014-1-10)恒生电子股份有限公司研发中心62T2SDKJAVA版开发指南3开发接口有无异常失败会抛出异常,详细信息可以在异常中获取。返回无用法说明摧毁订阅发布服务,负责摧毁之前建立的订阅者和发布者,并释放资源。在上层应用退出时调用。3.8.3获取订阅主题信息(GetTopic)函数原型publicstaticIDatasetGetTopic(booleanbyForce,intiTimeOut)throwsT2SDKException,MCException输入参数参数名称参数说明用法booleanbyForce是否强制从服务端刷新主题。如果不从服务端获取,则直接读取本地内存,初始化过程中,主题已经缓存在本地内存中。输入参数intiTimeOut超时时间,从服务端获取主题时的超时时间,如果从本地获取主题,该参数无意义。输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。返回返回主题属性组装而成的结果集接口。结果集字段说明如下:字段名称类型字段说明TopicName字符串主题名字。TopicNo整型主题编号。ReliableLevel整型可靠性等级,:\uf06c0:尽力而为\uf06c1:尽力有序\uf06c2:内存级\uf06c3:文件级文档版本01(2014-1-10)恒生电子股份有限公司研发中心63T2SDKJAVA版开发指南3开发接口字段名称类型字段说明\uf06c4:系统级IssuePriority整型发布优先级,数字越大优先级越高。默认是6,取值范围(6-13)。MsgLifetime整型主题消息的有效期,以分钟为单位,默认为0。只对文件级和系统级的主题有效。Stutas整型主题状态:\uf06c0:启用\uf06c1:禁用TickStrategy整型重名踢人策略:\uf06c0:不需要踢人\uf06c1:踢之前登录的\uf06c2:踢后登录的BusinessVerify整型是否需要业务校验:\uf06c0:不需要\uf06c1:需要Local整型是否是局部主题:\uf06c1:局部主题\uf06c0:全局主题FilterField1字符串第1个过滤字段名字FilterField2字符串第2个过滤字段名字FilterField3字符串第3个过滤字段名字FilterField4字符串第4个过滤字段名字FilterField5字符串第5个过滤字段名字FilterField6字符串第6个过滤字段名字FilterField7字符串第7个过滤字段名字FilterField8字符串第8个过滤字段名字FilterField9字符串第9个过滤字段名字FilterField10字符串第10个过滤字段名字FilterField11字符串第11个过滤字段名字FilterField12字符串第12个过滤字段名字FilterField13字符串第13个过滤字段名字文档版本01(2014-1-10)恒生电子股份有限公司研发中心64T2SDKJAVA版开发指南3开发接口字段名称类型字段说明FilterField14字符串第14个过滤字段名字FilterField15字符串第15个过滤字段名字FilterField16字符串第16个过滤字段名字SubscribeStr字符串订阅者操作列表PublishStr字符串发布者操作列表用法说明上层应用在查询主题信息时,可以调用该接口。3.8.4获取订阅者接口(GetSubscriber)函数原型publicstaticISubscriberGetSubscriber()throwsMCSubscribeException输入参数无有无异常失败会抛出异常,详细信息可以在异常中获取。返回失败返回NULL,成功返回对应的订阅者接口。用法说明构造一个订阅者接口,可以订阅、取消订阅、接收发布消息、根据初始化时获取的配置项来创建订阅者,是一个单例,如果已经存在就直接返回。3.8.5获取发布者接口(GetPublisher)函数原型publicstaticIPublisherGetPublisher()throwsMCPublishException输入参数无有无异常失败会抛出异常,详细信息可以在异常中获取。文档版本01(2014-1-10)恒生电子股份有限公司研发中心65T2SDKJAVA版开发指南3开发接口返回失败返回NULL,成功返回对应的发布者接口。用法说明构造一个发布者接口,可以发布消息,根据初始化时获取的配置项创建发布者,是一个单例,如果已经存在就直接返回。3.8.6获取错误信息(GetErrorMsg)函数原型publicstaticStringGetErrorMsg(interrorNo)输入参数参数名称参数说明用法interrorNo具体的错误码输入参数有无异常无返回返回对应的错误码的详细错误信息。用法说明订阅发布接口函数调用返回错误码时,可以调用该函数获取具体的错误信息。3.9订阅者接口【ISubscriber】订阅者主要负责订阅和取消订阅,以及接收推送回来的消息,订阅接口的实例来自于MCServers的GetSubscriber函数。订阅者也需要在配置文件里面配置,具体配置内容如下: 订阅者是一个单例,上层需要订阅时,就需要通过MCServers的GetSubscriber函数,传入上面配置中的”xuxp”名字,获取对应的订阅接口。3.9.1订阅主题(SubscribeTopic)函数原型publicintSubscribeTopic(MCSubscribeParametersubParam,intiTimeout)throws文档版本01(2014-1-10)恒生电子股份有限公司研发中心66T2SDKJAVA版开发指南3开发接口MCSubscribeException;输入参数参数名称参数说明用法MCSubscribeParametersubParam订阅参数对象,包含主题和过滤条件等信息,具体的操作可以参考下面的订阅参数说明。输入参数intiTimeout订阅是同步的,该参数表示超时时间。输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。返回返回大于0表示订阅成功;-2表示重复订阅,也可以当成订阅成功处理;其他返回值可以用上面的消息中心服务GetErrorMsg接口获取详细错误信息。返回值也是订阅标识,为取消订阅的标识输入。用法说明使用该函数时需要构造自己需要的订阅参数对象,订阅参数的构造代码如下:MCSubscribeParametersubParam=newMCSubscribeParameter();//调用接口添加订阅属性subParam.SetTopicName("secu.deal_return");………..3.9.2取消订阅(CancelSubscribeTopic)函数原型publicintCancelSubscribeTopic(intsubIndex)throwsMCSubscribeException;输入参数参数名称参数说明用法intsubIndex订阅标识,来自于上面订阅成功的返回值输入参数有无异常失败会抛出异常,详细信息可以在异常中获取。文档版本01(2014-1-10)恒生电子股份有限公司研发中心67T2SDKJAVA版开发指南3开发接口返回返回0表示取消订阅成功,其他返回值表示取消订阅失败,具体信息可以使用消息中心服务GetErrorMsg接口获取。用法说明取消订阅的参数来自于订阅成功的返回值,因此需要订阅成功时保存标识与订阅参数的对应关系,在程序需要取消订阅时,可以根据订阅属性对应到该标识。也可以通过下面的GetSubcribeTopic接口获取订阅的标识。3.9.3获取已订阅的信息(GetSubcribeTopic)函数原型publicvoidGetSubcribeTopic(IDatasetoutDataSet);输入参数参数名称参数说明用法IDatasetoutDataSet外面传入空的IDataset结果集接口,内部会把订阅信息添加到里面输出参数返回无用法说明所有的订阅信息会打包在结果集outDataSet里,具体的结果集返回字段如下表所示。字段名称类型字段说明SubcribeIndex整型订阅标识,可以用于取消订阅IsBornTopic整型先天订阅标志:\uf06c0:不是先天订阅\uf06c1:先天订阅TopicName字符串主题名称TopicNo整型主题编号FilterRaw字符串过滤条件的字符串表达形式Appdata二进制订阅的附加二进制数据SendInterval整型发送间隔ReturnFileds字符串返回字段字符串表达式isReplace整型是否是替换订阅:文档版本01(2014-1-10)恒生电子股份有限公司研发中心68T2SDKJAVA版开发指南3开发接口字段名称类型字段说明\uf06c1:是\uf06c0:否isFromNow整型是否补缺:\uf06c1:需要补缺\uf06c0:不需要补缺Stutas整型订阅所处的状态\uf06c0:补缺\uf06c1:实时发布状态\uf06c2:补缺结束状态QueueCount整型队列长度,表示补缺完成之前,实时发布过来的消息的积压个数。3.10订阅参数对象【MCSubscribeParameter】该对象作为订阅接口SubscribeTopic的参数传入,主要用于设置和获取相关参数,包括主题名字、附加数据、过滤字段、返回字段、覆盖标志、补缺标志和发送间隔等。3.10.1设置主题名字(SetTopicName)函数原型publicvoidSetTopicName(StringszName)输入参数参数名称参数说明用法StringszName主题名字输入参数返回无用法说明订阅的主题名字。名字必须是服务端配置的主题,可以通过MCServers服务的GetTopic()函文档版本01(2014-1-10)恒生电子股份有限公司研发中心69T2SDKJAVA版开发指南3开发接口数来获取服务端配置的主题。3.10.2添加附加数据(SetAppData)函数原型publicvoidSetAppData(byte[]data)输入参数参数名称参数说明用法byte[]data附加数据输入参数返回无用法说明附加数据是指订阅时由订阅者送入,然后订阅服务端在推送消息时,每个消息发布都会原样返回的数据。一般用于框架程序定位到订阅具体属于某个窗口时。3.10.3添加过滤字段(SetFilter)函数原型publicvoidSetFilter(StringfilterName,StringfilterValue)输入参数参数名称参数说明用法StringfilterName过滤字段名字输入参数StringfilterValue过滤字段值输入参数返回无用法说明过滤字段是在主题里定义的,过滤字段名字需要根据主题里面的属性来设置。如果设置的过滤字段不在主题定义里面,服务端会将其当成自定义过滤字段处理,自定义过滤字段最多允许两个。自定义过滤字段和主题已定义的过滤字段区别在于,后台服务端处理自定义过滤字段的效率比较低,一般不建议使用自定义过滤。如果需要订阅某个主题的所有消息,则不设置过滤字段。文档版本01(2014-1-10)恒生电子股份有限公司研发中心70T2SDKJAVA版开发指南3开发接口3.10.4追加返回字段(AppendReturnFiled)函数原型publicvoidAppendReturnFiled(StringfiledName)输入参数参数名称参数说明用法StringfiledName返回字段的名字输入参数返回无用法说明订阅者可以要求服务端针对某个主题的消息,只返回规定的字段,主要目的是减少带宽占用,排除不用的字段信息。该接口主要用于追加返回字段,可以多次调用,如果设置的字段不在发布包里,则该字段无效。多个返回字段之间用‘\\2’字符隔开。3.10.5设置补缺标志(SetFromNow)函数原型publicvoidSetFromNow(booleanbFromNow)输入参数参数名称参数说明用法booleanbFromNow是否补缺,true表示补缺,false表示不补缺,默认不补缺输入参数返回无用法说明补缺是指订阅端不在线期间,如果文件级及系统级的主题有消息发布出来,等订阅端再订阅时,可以找服务端补缺这个期间的报文。3.10.6设置覆盖标志(SetReplace)函数原型文档版本01(2014-1-10)恒生电子股份有限公司研发中心71T2SDKJAVA版开发指南3开发接口publicvoidSetReplace(booleanbReplace)输入参数参数名称参数说明用法booleanbReplace是否覆盖,true表示覆盖,false表示不覆盖,默认不覆盖输入参数返回无用法说明覆盖是指上层应用发起很多个订阅,如果想取消之前所有的订阅,可以在发起新的订阅时,指定为覆盖方式的订阅,就可以取消之前所有的订阅,只留下当前的订阅。3.10.7设置发送间隔(SetSendInterval)函数原型publicvoidSetSendInterval(intnSendInterval)输入参数参数名称参数说明用法intnSendInterval发送间隔,单位是秒。默认是实时推送,没有间隔。输入参数返回无用法说明发送间隔是指订阅端希望服务端向自己推送报文的间隔,不要实时的推送。3.10.8获取主题名字(GetTopicName)函数原型publicStringGetTopicName()输入参数无文档版本01(2014-1-10)恒生电子股份有限公司研发中心72T2SDKJAVA版开发指南3开发接口返回返回订阅参数里面的主题名字。3.10.9获取附加数据(GetAppData)函数原型publicbyte[]GetAppData()输入参数无返回返回订阅参数里面的附加数据,以二进制的数组方式返回。3.10.10获取过滤字段(GetFilter)函数原型publicMCFilterGetFilter()输入参数无返回返回订阅参数里面的过滤字段,以过滤对象的方式返回,具体过滤对象的接口下面介绍。3.10.11获取返回字段(GetReturnFiled)函数原型publicStringGetReturnFiled()输入参数无返回返回订阅参数里所有的返回字段,用字符’\\2’间隔。3.10.12获取补缺标志(GetFromNow)函数原型publicbooleanGetFromNow()文档版本01(2014-1-10)恒生电子股份有限公司研发中心73T2SDKJAVA版开发指南3开发接口输入参数无返回返回订阅参数里的补缺标志。3.10.13获取覆盖标志(GetReplace)函数原型publicbooleanGetReplace()输入参数无返回返回订阅参数里的覆盖标志。3.10.14获取发送间隔(GetSendInterval)函数原型publicintGetSendInterval()输入参数无返回返回订阅参数里面的发送间隔。3.11过滤条件接口【MCFilter】过滤条件是在存放订阅时,根据主题配置的过滤字段传入过滤字段名字和值,便于服务端根据需要推送客户端关心的数据,是一个字段名字和值一一对应的数据结构。3.11.1根据过滤字段名字获取对应值(GetFilterValue)函数原型publicStringGetFilterValue(StringfileterName)输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心74T2SDKJAVA版开发指南3开发接口参数名称参数说明用法StringfileterName过滤字段的名字输入参数返回返回过滤条件中对应过滤字段名字的值,没有对应的过滤字段值就返回NULL。3.11.2获取过滤条件个数(GetCount)函数原型publicintGetCount()输入参数无返回返回过滤条件中过滤字段的个数。3.11.3添加过滤条件(SetFilter)函数原型publicvoidSetFilter(StringfilterName,StringfilterValue)输入参数参数名称参数说明用法StringfilterName过滤字段的名字输入参数StringfilterValue过滤字段的值输入参数返回设置过滤条件信息,如果过滤字段已经存在,则覆盖原来过滤字段对应的值。3.11.4比较两个过滤条件是否相等(equal)函数原型publicbooleanequal(MCFilterdstFilter)输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心75T2SDKJAVA版开发指南3开发接口参数名称参数说明用法MCFilterdstFilter被比较的过滤字段输入参数返回相等返回true,失败则返回false。参数传入的过滤条件与当前过滤条件的字段名和字段值一一比较,不相等就返回false。3.12订阅者回调接口【ISubCallback】该回调接口由上层程序实现,并在配置文件中配置,配置内容如下: 只要是该订阅者订阅的消息,在发布的时候都会回调上层的test.mctestcallback类。3.12.1接收到发布消息的回调(OnReceived)函数原型publicvoidOnReceived(StringtopicName,IEventevent);输入参数参数名称参数说明用法StringtopicName主题名字。回调IEventevent发布过来的完整消息,从中获取具体的发布内容。回调用法说明发布消息的所有字段都存在event中,上层应用通过event结构获取各个字段的内容,从而获取需要的数据,具体的接口介绍可以参考IEvent的接口说明。3.12.2接收到踢人消息的回调(OnReceived)函数原型publicvoidOnRecvTickMsg(MCSubscribeParameterparam,StringtickMsgInfo);输入参数文档版本01(2014-1-10)恒生电子股份有限公司研发中心76T2SDKJAVA版开发指南3开发接口参数名称参数说明用法MCSubscribeParameterparam被踢掉的订阅对象回调StringtickMsgInfo踢人的详细信息回调用法说明该接口回调时表明自己的订阅被其他同名订阅踢掉,具体哪个订阅被踢,以及被踢的相关信息在接口参数中返回。3.13发布者接口【IPublisher】发布者主要负责发布消息到消息中心,发布者对象是一个单例,可通过MCServers的GetPublisher函数获取,对应的发布者配置信息如下所示: 与订阅一样,上层应用需要通过传入名字”xuxp”获取发布者,进行发布消息操作。3.13.1发布消息(PubMsg)函数原型publicintPubMsg(StringtopicName,IDatasetpubDataSet,intiTimeout)throwsMCPublishException;输入参数参数名称参数说明用法StringtopicName主题名字输入参数IDatasetpubDataSet具体发布的消息内容,以结果集的形式发布输入参数IntiTimeout超时时间-有无异常失败会抛出异常,详细信息可以在异常中获取。返回返回0表示成功,其他返回值表示失败,详细的错误信息可以用消息中心服务GetErrorMsg接口获取。用法说明文档版本01(2014-1-10)恒生电子股份有限公司研发中心77T2SDKJAVA版开发指南3开发接口pubDataSet是一个结果集的形式,该结果集要求必须包含发布的主题规定的过滤字段,否则就会发布失败。文档版本01(2014-1-10)恒生电子股份有限公司研发中心78T2SDKJAVA版开发指南3开发接口4示例代码本章主要是代码的示例,分成下面四个开发模式。本文未展示完整代码,完整代码请参考发布包中的例子。4.1配置文件t2sdk-config.xml文档版本01(2014-1-10)恒生电子股份有限公司研发中心79T2SDKJAVA版开发指南3开发接口 4.2同步发送代码publicclassJresTest{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubIClientclient=null;T2Servicesserver=T2Services.getInstance();//获取T2SDK配置文件中配置的连接try{server.init();server.start();//myserver是配置在配置文件中的服务client=server.getClient("myserver");//获取eventIEventevent=ContextUtil.getServiceContext().getEventFactory().getEventByAlias("88",EventType.ET_REQUEST);//往event中添加datasetIDatasetdataset=DatasetService.getDefaultInstance().getDataset();dataset.addColumn("branch_no");dataset.addColumn("operator_no");dataset.addColumn("fund_account");dataset.appendRow();dataset.updateString("branch_no","1");dataset.updateString("operator_no","1");dataset.updateString("fund_account","2");event.putEventData(dataset);//同步发送如下IEventrsp=client.sendReceive(event,10000);//先判断返回值if(rsp.getReturnCode()!=EventReturnCode.I_OK){//返回错误System.out.println(rsp.getErrorNo()+":"+rsp.getErrorInfo());}else{文档版本01(2014-1-10)恒生电子股份有限公司研发中心80T2SDKJAVA版开发指南3开发接口StringBuildersb=newStringBuilder();//获得结果集IDatasetsresult=rsp.getEventDatas();//获得结果集总数intdatasetCount=result.getDatasetCount();//遍历所有的结果集for(inti=0;i 的id号必须填入event,否则回调不回应答event.setAttributeValue(EventTagdef.TAG_SENDERID,3);client.send(event);//这样异步发送出去后,应答会在com.jres.test.CallBack回调中返回//异步发送到此结束//最后server.stop();文档版本01(2014-1-10)恒生电子股份有限公司研发中心83T2SDKJAVA版开发指南3开发接口}catch(T2SDKExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}4.4订阅代码下面是消息中心2.0的订阅代码,后台必须配置消息中心2.0才可以。publicclassTestSubscribe{publicstaticvoidmain(String[]args)throwsMCSubscribeException{T2Servicesserver=T2Services.getInstance();//TODOAuto-generatedmethodstub//启动T2SDK,只需要在服务器启动时调用一次就可以了try{server.init();}catch(T2SDKExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}server.start();//初始化MC服务try{MCServers.MCInit();}catch(T2SDKExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(MCExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}//获取MC服务中订阅接口ISubscribersubscriber=MCServers.GetSubscriber();MCSubscribeParametersubParam=newMCSubscribeParameter();subParam.SetTopicName("secu.rzrq_contract_flow");byte[]data={1,3,5,8,9,10,2,3,0};subParam.SetAppData(data);文档版本01(2014-1-10)恒生电子股份有限公司研发中心84T2SDKJAVA版开发指南3开发接口subParam.SetFromNow(true);subParam.SetReplace(true);subParam.SetFilter("branch_no","B");subParam.SetFilter("fund_account","600625");intiRet=subscriber.SubscribeTopic(subParam,3000);//返回iRet>0表示成功System.out.println("RESULT:"+iRet);System.out.println("");System.out.println("输入任意字符取消订阅");try{System.in.read();}catch(IOExceptione){//TODOAuto-generatedcatchblock//e.printStackTrace();}iRet=subscriber.CancelSubscribeTopic(iRet);System.out.println("CancelSubscribeTopic:"+subParam.GetTopicName()+"返回码:"+iRet);System.out.println("输入任意字符退出");try{System.in.read();}catch(IOExceptione){//TODOAuto-generatedcatchblock//e.printStackTrace();}//释放资源MCServers.Destroy();server.stop();System.out.println("退出!");}}相应的回调接口实现代码如下:publicclassmctestcallbackimplementsISubCallback{publicstaticintg_iCount=0;@OverridepublicvoidOnReceived(StringtopicName,IEventevent){//TODOAuto-generatedmethodstubg_iCount++;//if(g_iCount%100==0)System.out.println("Count:"+g_iCount);System.out.println(topicName);文档版本01(2014-1-10)恒生电子股份有限公司研发中心85T2SDKJAVA版开发指南3开发接口DatasetService.printDataset(event.getEventDatas().getDataset(0));}@OverridepublicvoidOnRecvTickMsg(MCSubscribeParameterparam,StringtickMsgInfo){//TODOAuto-generatedmethodstub}}4.5发布代码publicclassTestPublish{publicstaticvoidmain(String[]args){T2Servicesserver=T2Services.getInstance();//TODOAuto-generatedmethodstubtry{//启动T2SDK,只需要在服务器启动时调用一次就可以了server.init();server.start();//初始化MC服务MCServers.MCInit();//获取数据集IDatasetdataset=DatasetService.getDefaultInstance().getDataset();//填充数据集字段dataset.addColumn("branch_no");//dataset.addColumn("operator_no");dataset.addColumn("fund_account");dataset.appendRow();dataset.updateString("branch_no","B");//dataset.updateString("operator_no","1");dataset.updateString("fund_account","600625");//获取MC服务中发布接口IPublisherpublisher=MCServers.GetPublisher();//发布消息while(true){intiRet=publisher.PubMsg("secu.rzrq_contract_flow",dataset,5000);System.out.println("发布返回结果:"+iRet);System.out.println("是否退出,[y]退出,[其他字符]继续");charch=\'0\';文档版本01(2014-1-10)恒生电子股份有限公司研发中心86T2SDKJAVA版开发指南3开发接口try{ch=(char)System.in.read();}catch(IOExceptione){//TODOAuto-generatedcatchblock//e.printStackTrace();}if(ch==\'y\'){break;}}//释放资源MCServers.Destroy();server.stop();}catch(T2SDKExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(MCExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(MCPublishExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}文档版本01(2014-1-10)恒生电子股份有限公司研发中心87T2SDKJAVA版开发指南3开发接口5常见问题5.1如何正确初始化JAVAT2SDK?使用T2Services.getInstance().init();T2Services.getInstance().start();这两个方法初始化T2SDK时,只需在在整个JAVA进程启动时执行一次即可。如果在webServer中使用T2SDK(如tomcat),建议在ServletContextListener的contextInitialized方法中执行;如果写的是JAVA程序,建议在JAVA代码的静态代码段中执行。典型的错误用法,在每次业务代码调用同步发送(sendReceive)之前来做T2SDK的init和start,这样会存在两个问题。首先init和start使得连接被重置,而导致之前的应答不能返回。此外T2SDK采用的是长连接模式,如果每次都做init和start会增加连接建立的开销,抛弃了T2SDK的优点。5.2T2SDK是线程安全的么?T2SDK的同步发送和异步发送方法T2Services.getInstance().getClient(clientName).sendReceive和send是线程安全的工具类方法。即在不同的JAVA线程中调用sendReceive或者send本身是不会发生问题的,但是调用者要确保发送相关的参数不会被跨线程调用。譬如下面这种场景:Thread1和Thread2是执行同一代码的不同线程。Thread1staticIEventevent;……T2Services.getInstance().getClient(clientName).sendReceive(event);Thread2staticIEventevent;……文档版本01(2014-1-10)恒生电子股份有限公司研发中心88T2SDKJAVA版开发指南3开发接口T2Services.getInstance().getClient(clientName).sendReceive(event);这里错误,是因为将同步发送的参数指向了一个static的成员,那么当Thread1和Thread2对event操作时,会发生线程安全问题,而跨线程调用sendReceive本身是线程安全的。5.3频繁调用T2Services.getInstance().getClient是否会导致对象数量膨胀,是否需要将client单例化?重复调用T2Services.getInstance().getClient不会导致client个数的增加,getClient每次调用时,只要name参数相同,返回的都是同一个client实例,因此不需要业务代码来保存client实例。5.4T2Services.getInstance().stop方法在什么时候调用?T2Services.getInstance().stop方法,通常在JAVA程序退出时被调用,它的作用是释放JAVAT2SDK的线程及socket资源。如果程序是在tomcat等webServer中执行的话,在关闭webServer时,资源会被自动释放,因此也可以不调用stop方法。5.5JAVAT2SDK是长连接吗?是socket长连接,JAVAT2SDK连接池会维护socket连接的可用。5.6在网速较慢的场景下(例如ping大于50ms),如何使用JAVAT2SDK?在网速较慢且不稳定的情况下,JAVAT2SDK初始化连接和注册需要较长的时间。调用者可以通过设置performance->connectionWaitTimes来增加注册的等待时间,该参数设置为整型值,等待时间=connectionWaitTimes1.5秒,connectionWaitTimes默认为1。文档版本01(2014-1-10)恒生电子股份有限公司研发中心89T2SDKJAVA版开发指南3开发接口5.7JAVAT2SDK的调用会阻塞通讯线程么?当服务吞吐量上不去的时候,用户常常会有这样的疑问,JAVAT2SDK在同步应答时间较长或回调方法时间较长的情况下,会不会一直占用socket,导致性能下降呢?答案是“不会”,在异步调用的情况下,通讯线程会将报文交给专门的处理线程池并立即返回,通讯线程不会阻塞。而在同步调用情况下,当请求被写入socket后,socket使用权即被释放,在请求发出而应答未到达这段时间中,连接是可以被复用的。5.8使用异步发送方法send,配置的回调ID是否可以定义为任意整数?不行,用户定义的回调ID必须使用正整数,0和负数被系统保留使用。文档版本01(2014-1-10)恒生电子股份有限公司研发中心90',)