我正在使用sse发射器实现通知系统,1-客户端调用订阅APi,服务器创建新的ssEmtter并将其返回给客户端。
SseEmitter sseEmitter = new SseEmitter(24 * 60 * 60 * 1000l);
emitterService.addEmitter(sseEmitter);
log.info("subscribed");
return sseEmitter;
}2-在发布中,服务器使用此sseEmiter并发送消息
我的问题是,当我在浏览器中刷新页面时,服务器尝试发送消息,我得到了这个异常,我如何保持sse发射器的连接,即使我在浏览器中刷新页面,org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter.send(ResponseBodyEmitter.java:196) at org.springframework.web.servlet.mvc.method.annotation.SseEmitter.send(SseEmitter.java:126) at com.efinance,ResponseBodyEmitter已经完成。.service.entity.service.EmitterServiceImpl.lambda$2(EmitterServiceImpl.java:102) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at com.efinance.service.entity.service.EmitterServiceImpl.pushNotification(EmitterServiceImpl.java:95) at com.efinance.service.entity.service.EmitterServiceImpl$$FastClassBySpringCGLIB$$9e4e84c6.invoke() at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) at com.efinance.service.entity.service.EmitterServiceImpl$$EnhancerBySpringCGLIB$$c2c5d230.pushNotification() at com.efinance.service.entity.service.EntityPansUnderThresholdJob.notifyEntityPansUnderThreshold(EntityPansUnderThresholdJob.java:57) at jdk.internal.reflect.GeneratedMethodAccessor136.invoke(Unknown Source) java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:774) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88) at com.efinance.service.entity.tenant.TenantAspect.lambda$0(TenantAspect.java:36) at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) at com.efinance.service.entity.tenant.TenantAspect.handelTenantNames(TenantAspect.java:29) at jdk.internal.reflect.GeneratedMethodAccessor138.invoke(Unknown Source) java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) at org.springframework.aop。aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(( com.efinance.service.entity.service.EntityPansUnderThresholdJob$$EnhancerBySpringCGLIB$$e85299cc.notifyEntityPansUnderThreshold() at jdk.internal.reflect.GeneratedMethodAccessor136.invoke(Unknown Source)在java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:834)
对于客户端,我使用的是角
console.log('call subscripe'); const eventSource = new EventSourcePolyfill(('http://localhost:8587/subscription'), { headers: { 'Authorization': 'Bearer ' + sessionStorage.getItem("token") }, heartbeatTimeout: 1000000 });
eventSource.onopen = (e) => console.log("open");
eventSource.onmessage = (e) => { console.log(e)}
eventSource.onerror = (e) => {
if (e.readyState == EventSource.CLOSED) {
console.log("close");
} else {
console.log(e);
}即使我在浏览器中刷新页面,如何保持sse发射器的连接正常?
发布于 2022-11-14 07:27:16
当你刷新的时候。你必须再次订阅你的客户。
这将在后端创建一个新的SseEmitter。然后,当您想从后端发送新数据时,发送到所有相关的SseEmitters。
一个成功,另一个从后端发送失败(因为刷新破坏了前端的旧eventSource侦听器)。从emitterService中删除那些失败的内容。
https://stackoverflow.com/questions/71589565
复制相似问题