公司最近的一个项目有这样一个需求:就是通过java代码调用RTX提供的API向RTX发送消息,达到一种及时提醒的效果。
让我对RTX有了一定的了解和认识:
虽然RTX提供的API还比较丰富,但操作的过程中还是会碰到一些大大小小的问题。
我所碰到的第一个问题就是数字账号无法发送消息的问题:
public int sendNotice(RtxSendNoticeBean rtxb) {
int iRet= -1;
RTXSvrApi RtxsvrapiObj = new RTXSvrApi(); //RTX提供的API
if( RtxsvrapiObj.Init()){
RtxsvrapiObj.setServerIP(rtxb.getServerip()); //设置RTX服务器IP地址
RtxsvrapiObj.setServerPort(rtxb.getServerprot()); //设置RTX服务器端口
String szKey = RtxsvrapiObj.getSessionKey(rtxb.getRecivers());
System.out.println("SessionKey:" + szKey);
//API中的消息发送 功能 0:操作成功 非0:操作不成功
iRet = RtxsvrapiObj.sendNotify(rtxb.getRecivers(),rtxb.getTitle(),rtxb.getContent(), rtxb.getType(),rtxb.getDelarytime());
}
if (iRet == 0){
System.out.println("发送成功");
}else{
System.out.println("发送失败");
}
RtxsvrapiObj.UnInit();
return iRet;
}
使用以上代码,若RTX是非纯数字账号就没问题,可以发送。但如果是纯数字账号就没反应,经多处查找资料得处结果,这是RTX2011之前版本的bug。要想同时操作数字账号可以用以下两种方式解决:
1、直接安装RTX2011版SDK(若此方案可行就不用再做不第二步操作)。
下载文件:RTXS2011SDK(8.0.786.202).exe
2、如果已安装2010版SDK,又不想使用RTX2011版SDK,就需要做已下修改:
a. 把RTXSSDK2010安装目录下的SDKAPIC.dll、SDKAPI.dll、SDKAPIJava.dll用RTX2011SDK中的进行覆盖。
b. 再把SDKAPIC.dll、SDKAPI.dll、SDKAPIJava.dll拷贝去覆盖./windows/system32
c. 用regsvr32 命令注册一下SDKAPI.dll文件。
最后需要在RTX提供的API中添加一行代码:
/**
* 发送消息提醒
* @param receivers String 接收人(多个接收人以逗号分隔)
* @param title String 消息标题
* @param msg String 消息内容
* @param type String 0:普通消息 1:紧急消息
* @param delayTime String 显示停留时间(毫秒) 0:为永久停留(用户关闭时才关闭)
* @return int 0:操作成功 非0:操作不成功
*/
public int sendNotify(String receivers,String title,String msg, String type,String delayTime) {
svrInit(OBJNAME_RTXEXT);
AddProperty(iProp, KEY_USERNAME, receivers);
AddProperty(iProp, KEY_TITLE, title);
AddProperty(iProp, KEY_MSGINFO, msg);
AddProperty(iProp, KEY_TYPE, type);
AddProperty(iProp, KEY_MSGID, "0");
AddProperty(iProp, KEY_ASSISTANTTYPE, "0");
AddProperty(iProp,KEY_UINTYPE,"Account"); // 如果设置KEY_UINTYPE 为Account,无论传进去是纯数字还是字符串,都认为是帐号。
if(!"0".equals(delayTime))
AddProperty(iProp, KEY_DELAYTIME, delayTime);
iResult = Call(iObj, iProp, PRO_EXT_NOTIFY);
innerCode = GetResultInnerCode(iResult);
release();
return innerCode;
}
这样改好这后,大功告成!