在AX3.0中管理员可以通过在线用户管理对在线用户进行发送信息,是通过ClientSessions::sendMessage(int _sessionId, str _title, str _message)来发送,但在AX4.0之后的版本中就没有这个方法了。
现在可以使用的也就只有下面两种方法了
1、修改预警的功能,将消息通过预警功能传递
2、如果是远程终端的话,直接在远程服务器的任务管理器发送
但也一些问题:
1、通过预警功能,用户端只是显示有预警消息,并没有直接一个BOX弹出,经常被用户忽略
2、远程服务器任务管理器发送,如果不是使用远程桌面终端登录的就无法接收消息
那还没有没有其他方法呢?
今天翻一下Class/info,看到了一个方法watchDog(),就是在AX启动登录后,运行并按一定时间间隔不断循环这个方法。
1 void watchDog() 2 { 3 int infologLine; 4 this.setTimeOut(methodstr(Info,watchDog), #watchdogInterval, false); 5 6 infologLine = this.line(); 7 try 8 { 9 SysUserLog::updateLogoutTime(); 10 SysUtilElementsLog::persistRegisteredUsages(); 11 } 12 catch 13 { 14 // 15 // Clean up any exception messages in the infolog, caused by logging. 16 // 17 this.clear(infologLine); 18 } 19 }
看到这个,问题就解决了,我也写个这样的方法readMessage(),然后添加张表SysUserMessage,字段UserId,消息字段Message,是否已读字段IsRead,将要发送的消息根据UserId保存到表中,最后在readMessage()中读取弹出一个BOX
1 void readMessage() 2 { 3 SysUserMessage userMessage=SysUserMessage::findUserId(curuserid(),true); 4 ; 5 this.setTimeOut(methodstr(Info,readMessage), 3000, false); 6 if(userMessage && !userMessage.IsRead) 7 { ttsbegin; 8 userMessage.IsRead=true; 9 userMessage.update(); 10 ttscommit; 11 Box::info(userMessage.Message); 12 } 13 }
我默认设置的循环间隔是3秒,读取到消息后,更新消息已读取,用Box强制弹出。
这个方法的调用就放在startupPost()中
1 /* 2 No SYS code must exist in this method 3 */ 4 void startupPost() 5 { 6 this.setTimeOut(methodstr(Info,readMessage), 3000, false); 7 }
最后来看看效果,简单做了个发送界面,将要发送的消息根据UserId保存到表SysUserMessage中就可以了
简简单单就实现了发送在线消息的功能