为测试nw客户端对服务器消息推送的响应.
测试通知消息:176-Indication
参数名: message
每隔5秒发送一个订单或退单通知,含随机单据编号信息.
每隔5秒发送一个订单或退单通知,含随机单据编号信息.
涉及编程内容:
.创建一个定时任务
.连接事件挂钩
.发送消息
实现时发现框架没有广播消息接口.什么情况下需要?
xbox.cpp
ACE_THR_FUNC_RETURN NotifyMessage(void *arg) {
CXboxPlugin::instance()->NotifyMessage();
return 0;
}
int CXboxPlugin::NotifyMessage() {
CMsg *msg = new CMsg;
msg->SetMsgType(MT_INDICATION);
msg->SetMsgID(176);
char sheet_type[][16] = {"订单","退单"};
int rand_val = Rand();
string text = LogMsg("您接收到一个%s,单据编号:%lu",sheet_type[rand_val%2],rand_val);
msg->AddParam("message",text.c_str());
CWrappedMsg<> *pwm = new CWrappedMsg<>;
pwm->msg = msg;
int count = 0;
{
ACE_WRITE_GUARD_RETURN(ACE_Thread_Mutex,m,client_mutex_,-1);
vector<unsigned long>::iterator iter = clients_.begin();
while(iter!=clients_.end()) {
pwm->connid.push_back(*iter);
iter++;
count++;
}
}
if (count==0) {
delete pwm;
return 0;
}
network_->SendMsg(pwm);
return 0;
}
int CXboxPlugin::handle_input(unsigned long fd, HTX_Reactor_Mask mask,HTX_Event_Arg *arg) {
if (mask==HTX_Reactor_Base::CONNECT_MASK) {
ACE_WRITE_GUARD_RETURN(ACE_Thread_Mutex,m,client_mutex_,-1);
clients_.push_back(fd);
}
else if (mask==HTX_Reactor_Base::CLOSE_MASK) {
ACE_WRITE_GUARD_RETURN(ACE_Thread_Mutex,m,client_mutex_,-1);
vector<unsigned long>::iterator iter = clients_.begin();
while(iter!=clients_.end()) {
if (*iter==fd) {
clients_.erase(iter);
break;
}
iter++;
}
}
return 0;
}
int CXboxPlugin::Activate() {
reactor_->register_handler(this,HTX_Reactor_Base::CONNECT_MASK|HTX_Reactor_Base::CLOSE_MASK);
int rand_val = Rand();
enum { NOTIFY_INTERVAL=5}; ///< 通知消息间隔
IDeamonTask *task = deamon_mgr_->add(::NotifyMessage,"NotifyMessage",this);
task->set_timer_strategy(NOTIFY_INTERVAL);
return 0;
}
xbox.h
class CXboxPlugin :
public IEventHandler ,
public HTX_Event_Handler, /// 增加
public CBasePluginModule {
///< 增加以下代码:
ACE_Thread_Mutex client_mutex_; ///< clients_互斥体
vector<unsigned long> clients_; ///< 连接的客户端通道
int NotifyMessage(); ///< 向所有在线连接发送一个通知消息
int handle_input(unsigned long fd, HTX_Reactor_Mask masks,HTX_Event_Arg *arg);
...
};