Commit 88a41408 by qlintonger xeno

cancel-call和call成功,但是出现死锁问题,卡顿在step - 0这里 ==> 已解决+1

parent 6c413538
......@@ -54,7 +54,7 @@ pub async fn handle_agora_call(
);
// 直接发送CmdHangup消息给当前用户
let hangup_message_json = serde_json::json!({
"msgType": "CmdHangup",
"msgType": "CmdCancelCall",
"fromID": "0",
"fromName": "Server",
"toID": from_id,
......@@ -594,19 +594,22 @@ pub async fn handle_agora_call(
}
// 拒接电话
"Refuse" => {
println!("用户拒接电话 {}", from_id.to_string());
// 当前用户拒接电话之后,直接给当前用户发送CmdHangup消息
// 主动拒绝之后,也需要取消refuse_procedure_map的线程任务
let target_sender_or_not = { refuse_procedure_map.get(from_id) };
if let Some(ref_procedure_sender) = target_sender_or_not {
if let Some(ref ref_procedure_sender) = target_sender_or_not {
if let Err(e) = ref_procedure_sender.send(()) {
println!("取消拒绝接听的线程队列失败:{:?}", e);
} else {
println!("取消拒绝接听的线程队列成功");
}
drop(target_sender_or_not);
}
let user_data = { ONLINE_USERS.get(from_id) };
let mut current_channel_id = "".to_string();
// 给当前from_id用户发送CmdHangup,表示已经成功拒接了电话,并且修改了状态
if let Some(current_user_data) = user_data {
if let Some(ref current_user_data) = user_data {
let mut current_user_data_vec = current_user_data.split(',')
.map(|s| s.to_string())
.collect::<Vec<String>>();
......@@ -621,14 +624,20 @@ pub async fn handle_agora_call(
}
})
.to_string();
println!("step - Refuse - 0");
current_channel_id = current_user_data_vec[1].clone();
// 修改状态数据
current_user_data_vec[0] = "idle".to_string();
current_user_data_vec[1] = "".to_string();
current_user_data_vec[6] = "0".to_string();
println!("step - Refuse - 1");
let current_user_data_joined = current_user_data_vec.join(",");
drop(user_data);
drop(current_user_data_vec);
println!("step - Refuse - 2");
ONLINE_USERS.insert(from_id.to_string(), current_user_data_joined.clone());
let from_id_clone = from_id.to_string();
println!("step - Refuse - 3");
tokio::spawn(async move {
// 修改redis数据
if let Err(e) =
......@@ -639,6 +648,7 @@ pub async fn handle_agora_call(
println!("更新redis数据成功");
}
});
println!("step - Refuse - 4");
// 直接给sender发送数据通知
send_inside_message(
&target_sender_which,
......@@ -648,6 +658,8 @@ pub async fn handle_agora_call(
)
.await;
}
// 及时释放锁
println!("step - Refuse - 5");
// 注意,拒接电话只能有一个toID
// 在这里,toID的状态数据由客户端维护
// 找到对应toId的sender
......@@ -657,13 +669,14 @@ pub async fn handle_agora_call(
.find(|entry| entry.key().0 == client_message_data.to_id.to_string())
.map(|entry| entry.key().clone())
};
println!("step - Refuse - 6");
if let Some(target_sender) = sender_found {
// 直接发送CmdHangup数据
let cmd_refuse_message = serde_json::json!({
"msgType": "CmdRefuse",
"fromID": client_message_data.to_id,
"fromID": from_id,
"fromName": "Server",
"toID": from_id,
"toID": client_message_data.to_id,
"msgData": {
"channelId": "",
"rtcToken": ""
......@@ -680,10 +693,80 @@ pub async fn handle_agora_call(
} else {
println!("找不到toID对应的sender");
}
println!("step - Refuse - 7");
// 检查同频道下是不是目前只有1人在线
let current_all_chatters = {
ONLINE_USERS.iter()
.filter(|entry| entry.value().split(',').nth(1).unwrap() == current_channel_id)
.map(|entry| entry.key().to_string())
.collect::<Vec<String>>()
};
if current_all_chatters.len() == 1 {
// 如果只有一个人在线,则直接向该sender发送CmdCancelCall即可
let sender_found = {
CLIENT_SENDERS
.iter()
.find(|entry| entry.key().0 == current_all_chatters[0].to_string())
.map(|entry| entry.key().clone())
};
if let Some(sender) = sender_found {
println!("step - Refuse - 7.75 - alone");
// 直接发送CmdCancelCall
let cmd_cancel_call_message = serde_json::json!({
"msgType": "CmdCancelCall",
"fromID": "0",
"fromName": "Server",
"toID": current_all_chatters[0],
"msgData": {
"channelId": "",
"rtcToken": ""
}
})
.to_string();
send_inside_message(
&sender,
event_sender,
cmd_cancel_call_message,
&current_all_chatters[0],
)
.await;
println!("step - Refuse - 7.755 - alone");
// 修改状态数据
let target_id = current_all_chatters[0].to_string();
drop(current_all_chatters);
// 获取ONLINE_USERS
println!("step - Refuse - 7.758 - alone");
let target_ud = ONLINE_USERS.get(&target_id);
if let Some(target_ud) = target_ud {
let mut target_ud_vec: Vec<&str> = target_ud.split(',').collect();
target_ud_vec[0] = "idle";
target_ud_vec[1] = "";
target_ud_vec[6] = "0";
let target_ud_joined = target_ud_vec.join(",");
println!("step - Refuse - 7.7599 - alone");
drop(target_ud_vec);
drop(target_ud);
ONLINE_USERS.insert(target_id.clone(), target_ud_joined.clone());
println!("step - Refuse - 7.759999 - alone");
tokio::spawn(async move {
// 修改redis数据
if let Err(e) =
update_client_redis_data(&target_id, target_ud_joined).await
{
println!("更新redis数据失败:{:?} 用户id {}", e, target_id);
} else {
println!("更新redis数据成功");
}
});
}
}
}
println!("step - Refuse - 7.8");
tokio::spawn(async move {
// 要求所有用户更新在线人员列表
notify_all_clients_to_update_online_users().await;
});
println!("step - Refuse - 8");
}
// 主持人结束通话
"EndMeeting" => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment