@ -49,35 +49,31 @@ public class MapLogisticSseServiceImpl implements IMapLogisticSseService {
@@ -49,35 +49,31 @@ public class MapLogisticSseServiceImpl implements IMapLogisticSseService {
public SseEmitter SseSubscribe ( String clientId ) {
KiccUser kiccUser = getUser ( ) ;
Optional . ofNullable ( clientId ) . orElseThrow ( ( ) - > new CommonException ( "当前客户端Id为空,请检查后重试!" ) ) ;
sseSignalContainers . removeIf ( item - > StrUtil . equals ( item . getClientId ( ) , clientId ) & & StrUtil . equals ( item . getTenantId ( ) , kiccUser . getTenantId ( ) ) ) ;
// 设置超时时间为1小时
SseEmitter sseEmitter = new SseEmitter ( 3600_000L ) ;
doMaintenance ( ) ;
if ( sseSignalContainers . stream ( )
. filter ( item - > StrUtil . equals ( item . getClientId ( ) , clientId ) & & StrUtil . equals ( item . getTenantId ( ) , kiccUser . getTenantId ( ) ) )
. collect ( Collectors . toSet ( ) ) . isEmpty ( ) ) {
SseSignalContainer sseSignalContainer = new SseSignalContainer (
clientId ,
kiccUser . getId ( ) ,
sseEmitter ,
kiccUser . getTenantId ( )
) ;
// 设置如果网络出错前端请求的重试时间为1s
sseEmitter . send ( SseEmitter . event ( ) . reconnectTime ( 1000 ) . data ( "创建通道连接成功" ) ) ;
sseSignalContainers . add ( sseSignalContainer ) ;
log . info ( "clientId:{},建立的用户Id为:{}" , clientId , kiccUser . getId ( ) ) ;
sseEmitter . onTimeout ( ( ) - > {
log . info ( "clientId:{},用户Id为:{},的SSE长轮询已经超时,正在删除当前的建立通道对象" , clientId , kiccUser . getId ( ) ) ;
sseSignalContainers . removeIf ( item - > StrUtil . equals ( item . getClientId ( ) , clientId ) & & StrUtil . equals ( item . getTenantId ( ) , kiccUser . getTenantId ( ) ) ) ;
} ) ;
sseEmitter . onCompletion ( ( ) - > {
log . info ( "clientId:{},用户Id为:{}的SSE长轮询已经返回响应关闭,正在删除当前的建立通道对象" , clientId , kiccUser . getId ( ) ) ;
sseSignalContainers . removeIf ( item - > StrUtil . equals ( item . getClientId ( ) , clientId ) & & StrUtil . equals ( item . getTenantId ( ) , kiccUser . getTenantId ( ) ) ) ;
} ) ;
sseEmitter . onError ( e - > {
log . info ( "clientId:{},当前用户Id为:{}的SSE长轮询出现异常,正在删除当前的建立通道对象,错误信息{}" , clientId , kiccUser . getId ( ) , e . getLocalizedMessage ( ) ) ;
sseSignalContainers . removeIf ( item - > StrUtil . equals ( item . getClientId ( ) , clientId ) & & StrUtil . equals ( item . getTenantId ( ) , kiccUser . getTenantId ( ) ) ) ;
} ) ;
} else throw new CommonException ( "客户端id重复,请重新设置确保唯一" ) ;
SseSignalContainer sseSignalContainer = new SseSignalContainer (
clientId ,
kiccUser . getId ( ) ,
sseEmitter ,
kiccUser . getTenantId ( )
) ;
// 设置如果网络出错前端请求的重试时间为1s
sseEmitter . send ( SseEmitter . event ( ) . reconnectTime ( 1000 ) . data ( "创建通道连接成功" ) ) ;
sseSignalContainers . add ( sseSignalContainer ) ;
log . info ( "clientId:{},建立的用户Id为:{}" , clientId , kiccUser . getId ( ) ) ;
sseEmitter . onTimeout ( ( ) - > {
log . info ( "clientId:{},用户Id为:{},的SSE长轮询已经超时,正在删除当前的建立通道对象" , clientId , kiccUser . getId ( ) ) ;
sseSignalContainers . removeIf ( item - > StrUtil . equals ( item . getClientId ( ) , clientId ) & & StrUtil . equals ( item . getTenantId ( ) , kiccUser . getTenantId ( ) ) ) ;
} ) ;
sseEmitter . onCompletion ( ( ) - > {
log . info ( "clientId:{},用户Id为:{}的SSE长轮询已经返回响应关闭,正在删除当前的建立通道对象" , clientId , kiccUser . getId ( ) ) ;
sseSignalContainers . removeIf ( item - > StrUtil . equals ( item . getClientId ( ) , clientId ) & & StrUtil . equals ( item . getTenantId ( ) , kiccUser . getTenantId ( ) ) ) ;
} ) ;
sseEmitter . onError ( e - > {
log . info ( "clientId:{},当前用户Id为:{}的SSE长轮询出现异常,正在删除当前的建立通道对象,错误信息{}" , clientId , kiccUser . getId ( ) , e . getLocalizedMessage ( ) ) ;
sseSignalContainers . removeIf ( item - > StrUtil . equals ( item . getClientId ( ) , clientId ) & & StrUtil . equals ( item . getTenantId ( ) , kiccUser . getTenantId ( ) ) ) ;
} ) ;
return sseEmitter ;
}