Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
ws-rst
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
qlintonger xeno
ws-rst
Commits
88a41408
Commit
88a41408
authored
Feb 19, 2025
by
qlintonger xeno
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
cancel-call和call成功,但是出现死锁问题,卡顿在step - 0这里 ==> 已解决+1
parent
6c413538
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
88 additions
and
5 deletions
+88
-5
src/handles/handle_agora_call.rs
+88
-5
No files found.
src/handles/handle_agora_call.rs
View file @
88a41408
...
@@ -54,7 +54,7 @@ pub async fn handle_agora_call(
...
@@ -54,7 +54,7 @@ pub async fn handle_agora_call(
);
);
// 直接发送CmdHangup消息给当前用户
// 直接发送CmdHangup消息给当前用户
let
hangup_message_json
=
serde_json
::
json!
({
let
hangup_message_json
=
serde_json
::
json!
({
"msgType"
:
"Cmd
Hangup
"
,
"msgType"
:
"Cmd
CancelCall
"
,
"fromID"
:
"0"
,
"fromID"
:
"0"
,
"fromName"
:
"Server"
,
"fromName"
:
"Server"
,
"toID"
:
from_id
,
"toID"
:
from_id
,
...
@@ -594,19 +594,22 @@ pub async fn handle_agora_call(
...
@@ -594,19 +594,22 @@ pub async fn handle_agora_call(
}
}
// 拒接电话
// 拒接电话
"Refuse"
=>
{
"Refuse"
=>
{
println!
(
"用户拒接电话 {}"
,
from_id
.to_string
());
// 当前用户拒接电话之后,直接给当前用户发送CmdHangup消息
// 当前用户拒接电话之后,直接给当前用户发送CmdHangup消息
// 主动拒绝之后,也需要取消refuse_procedure_map的线程任务
// 主动拒绝之后,也需要取消refuse_procedure_map的线程任务
let
target_sender_or_not
=
{
refuse_procedure_map
.get
(
from_id
)
};
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
(())
{
if
let
Err
(
e
)
=
ref_procedure_sender
.send
(())
{
println!
(
"取消拒绝接听的线程队列失败:{:?}"
,
e
);
println!
(
"取消拒绝接听的线程队列失败:{:?}"
,
e
);
}
else
{
}
else
{
println!
(
"取消拒绝接听的线程队列成功"
);
println!
(
"取消拒绝接听的线程队列成功"
);
}
}
drop
(
target_sender_or_not
);
}
}
let
user_data
=
{
ONLINE_USERS
.get
(
from_id
)
};
let
user_data
=
{
ONLINE_USERS
.get
(
from_id
)
};
let
mut
current_channel_id
=
""
.to_string
();
// 给当前from_id用户发送CmdHangup,表示已经成功拒接了电话,并且修改了状态
// 给当前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
(
','
)
let
mut
current_user_data_vec
=
current_user_data
.split
(
','
)
.map
(|
s
|
s
.to_string
())
.map
(|
s
|
s
.to_string
())
.collect
::
<
Vec
<
String
>>
();
.collect
::
<
Vec
<
String
>>
();
...
@@ -621,14 +624,20 @@ pub async fn handle_agora_call(
...
@@ -621,14 +624,20 @@ pub async fn handle_agora_call(
}
}
})
})
.to_string
();
.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
[
0
]
=
"idle"
.to_string
();
current_user_data_vec
[
1
]
=
""
.to_string
();
current_user_data_vec
[
1
]
=
""
.to_string
();
current_user_data_vec
[
6
]
=
"0"
.to_string
();
current_user_data_vec
[
6
]
=
"0"
.to_string
();
println!
(
"step - Refuse - 1"
);
let
current_user_data_joined
=
current_user_data_vec
.join
(
","
);
let
current_user_data_joined
=
current_user_data_vec
.join
(
","
);
drop
(
user_data
);
drop
(
current_user_data_vec
);
drop
(
current_user_data_vec
);
println!
(
"step - Refuse - 2"
);
ONLINE_USERS
.insert
(
from_id
.to_string
(),
current_user_data_joined
.clone
());
ONLINE_USERS
.insert
(
from_id
.to_string
(),
current_user_data_joined
.clone
());
let
from_id_clone
=
from_id
.to_string
();
let
from_id_clone
=
from_id
.to_string
();
println!
(
"step - Refuse - 3"
);
tokio
::
spawn
(
async
move
{
tokio
::
spawn
(
async
move
{
// 修改redis数据
// 修改redis数据
if
let
Err
(
e
)
=
if
let
Err
(
e
)
=
...
@@ -639,6 +648,7 @@ pub async fn handle_agora_call(
...
@@ -639,6 +648,7 @@ pub async fn handle_agora_call(
println!
(
"更新redis数据成功"
);
println!
(
"更新redis数据成功"
);
}
}
});
});
println!
(
"step - Refuse - 4"
);
// 直接给sender发送数据通知
// 直接给sender发送数据通知
send_inside_message
(
send_inside_message
(
&
target_sender_which
,
&
target_sender_which
,
...
@@ -648,6 +658,8 @@ pub async fn handle_agora_call(
...
@@ -648,6 +658,8 @@ pub async fn handle_agora_call(
)
)
.await
;
.await
;
}
}
// 及时释放锁
println!
(
"step - Refuse - 5"
);
// 注意,拒接电话只能有一个toID
// 注意,拒接电话只能有一个toID
// 在这里,toID的状态数据由客户端维护
// 在这里,toID的状态数据由客户端维护
// 找到对应toId的sender
// 找到对应toId的sender
...
@@ -657,13 +669,14 @@ pub async fn handle_agora_call(
...
@@ -657,13 +669,14 @@ pub async fn handle_agora_call(
.find
(|
entry
|
entry
.key
()
.
0
==
client_message_data
.to_id
.to_string
())
.find
(|
entry
|
entry
.key
()
.
0
==
client_message_data
.to_id
.to_string
())
.map
(|
entry
|
entry
.key
()
.clone
())
.map
(|
entry
|
entry
.key
()
.clone
())
};
};
println!
(
"step - Refuse - 6"
);
if
let
Some
(
target_sender
)
=
sender_found
{
if
let
Some
(
target_sender
)
=
sender_found
{
// 直接发送CmdHangup数据
// 直接发送CmdHangup数据
let
cmd_refuse_message
=
serde_json
::
json!
({
let
cmd_refuse_message
=
serde_json
::
json!
({
"msgType"
:
"CmdRefuse"
,
"msgType"
:
"CmdRefuse"
,
"fromID"
:
client_message_data
.to
_id
,
"fromID"
:
from
_id
,
"fromName"
:
"Server"
,
"fromName"
:
"Server"
,
"toID"
:
from
_id
,
"toID"
:
client_message_data
.to
_id
,
"msgData"
:
{
"msgData"
:
{
"channelId"
:
""
,
"channelId"
:
""
,
"rtcToken"
:
""
"rtcToken"
:
""
...
@@ -680,10 +693,80 @@ pub async fn handle_agora_call(
...
@@ -680,10 +693,80 @@ pub async fn handle_agora_call(
}
else
{
}
else
{
println!
(
"找不到toID对应的sender"
);
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
{
tokio
::
spawn
(
async
move
{
// 要求所有用户更新在线人员列表
// 要求所有用户更新在线人员列表
notify_all_clients_to_update_online_users
()
.await
;
notify_all_clients_to_update_online_users
()
.await
;
});
});
println!
(
"step - Refuse - 8"
);
}
}
// 主持人结束通话
// 主持人结束通话
"EndMeeting"
=>
{
"EndMeeting"
=>
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment