Skip to content

Commit f822fa1

Browse files
authored
Merge pull request #100 from PeterPeterWang/main
Fix dialogue memory leak risk
2 parents 73037c6 + db0df3c commit f822fa1

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

src/main/java/com/xiaozhi/communication/common/SessionManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.xiaozhi.entity.SysDevice;
55
import com.xiaozhi.entity.SysRole;
66
import com.xiaozhi.enums.ListenMode;
7+
import com.xiaozhi.event.ChatSessionCloseEvent;
78
import jakarta.annotation.PostConstruct;
89
import jakarta.annotation.PreDestroy;
910
import jakarta.annotation.Resource;
@@ -153,6 +154,7 @@ public void closeSession(ChatSession chatSession) {
153154
// 重置会话状态
154155
chatSession.setStreamingState(false);
155156
chatSession.setAudioSinks(null);
157+
applicationContext.publishEvent(new ChatSessionCloseEvent(chatSession));
156158
// 从会话映射中移除
157159
logger.info("会话已关闭 - SessionId: {} SessionType: {}", chatSession.getSessionId(), chatSession.getClass().getSimpleName());
158160
} catch (Exception e) {

src/main/java/com/xiaozhi/dialogue/service/DialogueService.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
import com.xiaozhi.dialogue.tts.factory.TtsServiceFactory;
1111
import com.xiaozhi.entity.SysConfig;
1212
import com.xiaozhi.entity.SysDevice;
13+
import com.xiaozhi.event.ChatSessionCloseEvent;
1314
import com.xiaozhi.utils.AudioUtils;
1415
import com.xiaozhi.utils.EmojiUtils;
1516
import com.xiaozhi.utils.EmojiUtils.EmoSentence;
1617
import jakarta.annotation.Resource;
1718
import org.slf4j.Logger;
1819
import org.slf4j.LoggerFactory;
20+
import org.springframework.context.ApplicationListener;
1921
import org.springframework.stereotype.Service;
2022
import org.springframework.util.ObjectUtils;
2123
import org.springframework.util.StringUtils;
@@ -33,7 +35,7 @@
3335
* 负责处理语音识别和对话生成的业务逻辑
3436
*/
3537
@Service
36-
public class DialogueService {
38+
public class DialogueService implements ApplicationListener<ChatSessionCloseEvent> {
3739
private static final Logger logger = LoggerFactory.getLogger(DialogueService.class);
3840
private static final DecimalFormat df = new DecimalFormat("0.00");
3941
private static final long TIMEOUT_MS = 5000;
@@ -84,6 +86,20 @@ public class DialogueService {
8486
private final Map<String, Semaphore> sessionSemaphores = new ConcurrentHashMap<>();
8587
private final Map<String, PriorityBlockingQueue<TtsTask>> sessionTaskQueues = new ConcurrentHashMap<>();
8688

89+
@Override
90+
public void onApplicationEvent(ChatSessionCloseEvent event) {
91+
ChatSession chatSession = event.getSession();
92+
if(chatSession != null) {
93+
// clean up dialogue audio paths and responses
94+
if (StringUtils.hasText(chatSession.getDialogueId())) {
95+
String dialogueId = chatSession.getDialogueId();
96+
dialogueAudioPaths.remove(dialogueId);
97+
dialogueResponses.remove(dialogueId);
98+
}
99+
cleanupSession(chatSession.getSessionId());
100+
}
101+
}
102+
87103
/**
88104
* 句子对象,用于跟踪每个句子的处理状态
89105
*/
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.xiaozhi.event;
2+
3+
import com.xiaozhi.communication.common.ChatSession;
4+
import org.springframework.context.ApplicationEvent;
5+
6+
import java.time.Clock;
7+
8+
/**
9+
* Session 关闭事件
10+
*/
11+
public class ChatSessionCloseEvent extends ApplicationEvent {
12+
13+
public ChatSessionCloseEvent(Object source) {
14+
super(source);
15+
}
16+
17+
public ChatSessionCloseEvent(Object source, Clock clock) {
18+
super(source, clock);
19+
}
20+
21+
public ChatSession getSession() {
22+
return (ChatSession) getSource();
23+
}
24+
25+
}

0 commit comments

Comments
 (0)