Commit d445f487 authored by alex yao's avatar alex yao

SSEUtil工具优化

parent afd2cb4c
package cn.com.poc.common.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* @author alex.yao
* @date 2025/3/4
*/
public class SSEUtil {
public class SSEUtil implements AutoCloseable {
private final Logger logger = LoggerFactory.getLogger(SSEUtil.class);
private final ServletOutputStream outputStream;
private final Object lock = new Object(); // 添加锁对象
private volatile boolean closed = false; // 添加关闭状态标记
public SSEUtil() throws IOException {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes =
(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletResponse response = servletRequestAttributes.getResponse();
if (response == null) {
throw new IOException("无法获取HttpServletResponse");
......@@ -37,32 +41,60 @@ public class SSEUtil {
}
public void send(String data) throws IOException {
String message = "data: " + data + "\n\n";
outputStream.write(message.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
if (closed) {
throw new IOException("SSE连接已关闭");
}
synchronized (lock) {
if (closed) {
throw new IOException("SSE连接已关闭");
}
String message = "data: " + data + "\n\n";
outputStream.write(message.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
}
}
public boolean complete() {
try {
outputStream.close();
} catch (IOException e) {
logger.error("无法关闭sse连接:{}", e.getMessage());
return false;
if (closed) {
return true; // 已经关闭,返回true
}
synchronized (lock) {
if (closed) {
return true;
}
try {
outputStream.close();
} catch (IOException e) {
logger.error("无法关闭sse连接:{}", e.getMessage());
return false;
}
return true;
}
return true;
}
public boolean completeByError(String errorMsg) {
try {
String mess = "data: " + errorMsg + "\n\n";
outputStream.write(mess.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
outputStream.close();
} catch (IOException e) {
logger.error("无法关闭sse连接:{}", e.getMessage());
return false;
if (closed) {
return true; // 已经关闭,返回true
}
synchronized (lock) {
if (closed) {
return true;
}
try {
String mess = "data: " + errorMsg + "\n\n";
outputStream.write(mess.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
outputStream.close();
} catch (IOException e) {
logger.error("无法关闭sse连接:{}", e.getMessage());
return false;
}
return true;
}
return true;
}
@Override
public void close() throws Exception {
complete();
}
}
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