增加 Wildfly 中服务器发送事件 (SSE) 连接的超时

问题描述 投票:0回答:1

我目前正在 Wildfly 中尝试服务器发送事件,并通过 EventSource 将此类事件发送到浏览器。一切正常,但如果 SSE 连接空闲两分钟,那么当我尝试通过连接发送内容时,Wildfly 会关闭连接,但有以下例外:

2023-07-11 15:22:00,282 ERROR [io.undertow.request.io] (default I/O-12) UT005088: Failed to execute ServletOutputStream.closeAsync() on IO thread: java.nio.channels.ClosedChannelException
    at [email protected]//io.undertow.conduits.ChunkedStreamSinkConduit.doWrite(ChunkedStreamSinkConduit.java:134)
    at [email protected]//io.undertow.conduits.ChunkedStreamSinkConduit.write(ChunkedStreamSinkConduit.java:128)
    at [email protected]//io.undertow.conduits.ChunkedStreamSinkConduit.write(ChunkedStreamSinkConduit.java:220)
    at [email protected]//org.xnio.conduits.Conduits.writeFinalBasic(Conduits.java:149)
    at [email protected]//io.undertow.conduits.ChunkedStreamSinkConduit.writeFinal(ChunkedStreamSinkConduit.java:228)
    at [email protected]//org.xnio.conduits.ConduitStreamSinkChannel.writeFinal(ConduitStreamSinkChannel.java:114)
    at [email protected]//io.undertow.channels.DetachableStreamSinkChannel.writeFinal(DetachableStreamSinkChannel.java:211)
    at [email protected]//io.undertow.server.HttpServerExchange$WriteDispatchChannel.writeFinal(HttpServerExchange.java:2198)
    at [email protected]//io.undertow.servlet.spec.ServletOutputStreamImpl.flushBufferAsync(ServletOutputStreamImpl.java:422)
    at [email protected]//io.undertow.servlet.spec.ServletOutputStreamImpl.closeAsync(ServletOutputStreamImpl.java:689)
    at [email protected]//io.undertow.servlet.spec.ServletOutputStreamImpl$1.run(ServletOutputStreamImpl.java:662)
    at [email protected]//org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:612)
    at [email protected]//org.xnio.nio.WorkerThread.run(WorkerThread.java:479)

2023-07-11 15:22:00,283 ERROR [za.co.ejb.session.esa.EsaSseService] (EJB default - 2) java.nio.channels.ClosedChannelException: java.util.concurrent.CompletionException: java.nio.channels.ClosedChannelException
    at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315)
    at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:320)
    at java.base/java.util.concurrent.CompletableFuture.uniExceptionally(CompletableFuture.java:994)
    at java.base/java.util.concurrent.CompletableFuture.uniExceptionallyStage(CompletableFuture.java:1008)
    at java.base/java.util.concurrent.CompletableFuture.exceptionally(CompletableFuture.java:2396)
    at java.base/java.util.concurrent.CompletableFuture.exceptionally(CompletableFuture.java:144)
    at [email protected]//org.jboss.resteasy.plugins.providers.sse.SseEventOutputImpl.internalWriteEvent(SseEventOutputImpl.java:278)
    at [email protected]//org.jboss.resteasy.plugins.providers.sse.SseEventOutputImpl.send(SseEventOutputImpl.java:207)
    at deployment.Test.war//za.co.ejb.session.misc.SseClientRegistry.send(SseClientRegistry.java:58)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at [email protected]//org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509)
    at [email protected]//org.jboss.as.weld.ejb.DelegatingInterceptorInvocationContext.proceed(DelegatingInterceptorInvocationContext.java:92)
    at [email protected]//org.jboss.weld.interceptor.proxy.WeldInvocationContextImpl.interceptorChainCompleted(WeldInvocationContextImpl.java:107)
    at [email protected]//org.jboss.weld.interceptor.proxy.WeldInvocationContextImpl.proceed(WeldInvocationContextImpl.java:126)
    at [email protected]//org.hibernate.validator.cdi.internal.interceptor.ValidationInterceptor.validateMethodInvocation(ValidationInterceptor.java:79)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at [email protected]//org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:73)
    at [email protected]//org.jboss.weld.interceptor.proxy.WeldInvocationContextImpl.invokeNext(WeldInvocationContextImpl.java:92)
    at [email protected]//org.jboss.weld.interceptor.proxy.WeldInvocationContextImpl.proceed(WeldInvocationContextImpl.java:124)
    at [email protected]//org.jboss.weld.bean.InterceptorImpl.intercept(InterceptorImpl.java:105)
    at [email protected]//org.jboss.as.weld.ejb.DelegatingInterceptorInvocationContext.proceed(DelegatingInterceptorInvocationContext.java:82)
    at [email protected]//org.jboss.as.weld.interceptors.EjbComponentInterceptorSupport.delegateInterception(EjbComponentInterceptorSupport.java:60)
    at [email protected]//org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.delegateInterception(Jsr299BindingsInterceptor.java:77)
    at [email protected]//org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:89)
    at [email protected]//org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:102)
    at [email protected]//org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:40)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
    at [email protected]//org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:52)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.singleton.SingletonComponentInstanceAssociationInterceptor.processInvocation(SingletonComponentInstanceAssociationInterceptor.java:53)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:56)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:201)
    at [email protected]//org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:392)
    at [email protected]//org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:160)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509)
    at [email protected]//org.jboss.weld.module.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:72)
    at [email protected]//org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:89)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:47)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.security.IdentityOutflowInterceptor.processInvocation(IdentityOutflowInterceptor.java:73)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.security.SecurityDomainInterceptor.processInvocation(SecurityDomainInterceptor.java:44)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.deployment.processors.StartupAwaitInterceptor.processInvocation(StartupAwaitInterceptor.java:22)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509)
    at [email protected]//org.jboss.as.ejb3.component.singleton.ContainerManagedConcurrencyInterceptor.processInvocation(ContainerManagedConcurrencyInterceptor.java:106)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:67)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:60)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:438)
    at [email protected]//org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:633)
    at [email protected]//org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:57)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
    at [email protected]//org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:198)
    at [email protected]//org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:191)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.security.IdentityInterceptor.lambda$processInvocation$0(IdentityInterceptor.java:47)
    at [email protected]//org.wildfly.security.auth.server.SecurityIdentity.runAsFunctionEx(SecurityIdentity.java:421)
    at [email protected]//org.wildfly.security.auth.server.Scoped.runAsFunctionEx(Scoped.java:161)
    at [email protected]//org.wildfly.security.auth.server.Scoped.runAsSupplierEx(Scoped.java:229)
    at [email protected]//org.jboss.as.ejb3.security.IdentityInterceptor.processInvocation(IdentityInterceptor.java:47)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
    at [email protected]//org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:81)
    at deployment.Test.war//za.co.ejb.session.misc.SseClientRegistry$$$view69.send(Unknown Source)
    at deployment.Test.war//za.co.ejb.session.esa.EsaSseService.send(EsaSseService.java:36)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at [email protected]//org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509)
    at [email protected]//org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.delegateInterception(Jsr299BindingsInterceptor.java:79)
    at [email protected]//org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:89)
    at [email protected]//org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:102)
    at [email protected]//org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:40)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
    at [email protected]//org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:52)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.singleton.SingletonComponentInstanceAssociationInterceptor.processInvocation(SingletonComponentInstanceAssociationInterceptor.java:53)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:56)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:254)
    at [email protected]//org.jboss.as.ejb3.tx.CMTTxInterceptor.requiresNew(CMTTxInterceptor.java:416)
    at [email protected]//org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:158)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509)
    at [email protected]//org.jboss.weld.module.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:81)
    at [email protected]//org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:89)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:47)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.security.IdentityOutflowInterceptor.processInvocation(IdentityOutflowInterceptor.java:73)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.security.SecurityDomainInterceptor.processInvocation(SecurityDomainInterceptor.java:44)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.deployment.processors.StartupAwaitInterceptor.processInvocation(StartupAwaitInterceptor.java:22)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:67)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:60)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:438)
    at [email protected]//org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:633)
    at [email protected]//org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:57)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
    at [email protected]//org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:198)
    at [email protected]//org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:191)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.LogDiagnosticContextRecoveryInterceptor.processInvocation(LogDiagnosticContextRecoveryInterceptor.java:82)
    at [email protected]//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.AsyncFutureInterceptorFactory$1.lambda$processInvocation$0(AsyncFutureInterceptorFactory.java:83)
    at [email protected]//org.wildfly.security.auth.server.SecurityIdentity.runAsFunctionEx(SecurityIdentity.java:421)
    at [email protected]//org.wildfly.security.auth.server.Scoped.runAsFunctionEx(Scoped.java:161)
    at [email protected]//org.wildfly.security.auth.server.Scoped.runAs(Scoped.java:73)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.AsyncFutureInterceptorFactory$1$1.runInvocation(AsyncFutureInterceptorFactory.java:92)
    at [email protected]//org.jboss.as.ejb3.component.interceptors.AsyncInvocationTask.run(AsyncInvocationTask.java:81)
    at [email protected]//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
    at [email protected]//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
    at [email protected]//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
    at [email protected]//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
    at java.base/java.lang.Thread.run(Thread.java:1623)
    at [email protected]//org.jboss.threads.JBossThread.run(JBossThread.java:513)
Caused by: java.nio.channels.ClosedChannelException
    at [email protected]//io.undertow.conduits.WriteTimeoutStreamSinkConduit.handleWriteTimeout(WriteTimeoutStreamSinkConduit.java:102)
    at [email protected]//io.undertow.conduits.WriteTimeoutStreamSinkConduit.write(WriteTimeoutStreamSinkConduit.java:117)
    at [email protected]//io.undertow.server.protocol.http.HttpResponseConduit.write(HttpResponseConduit.java:652)
    at [email protected]//io.undertow.conduits.ChunkedStreamSinkConduit.doWrite(ChunkedStreamSinkConduit.java:166)
    at [email protected]//io.undertow.conduits.ChunkedStreamSinkConduit.write(ChunkedStreamSinkConduit.java:128)
    at [email protected]//org.xnio.conduits.ConduitStreamSinkChannel.write(ConduitStreamSinkChannel.java:150)
    at [email protected]//io.undertow.channels.DetachableStreamSinkChannel.write(DetachableStreamSinkChannel.java:240)
    at [email protected]//io.undertow.server.HttpServerExchange$WriteDispatchChannel.write(HttpServerExchange.java:2205)
    at [email protected]//io.undertow.servlet.spec.ServletOutputStreamImpl.flushInternal(ServletOutputStreamImpl.java:523)
    at [email protected]//io.undertow.servlet.spec.ServletOutputStreamImpl.flush(ServletOutputStreamImpl.java:479)
    at [email protected]//org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$WrappedServletOutputStream.flush(HttpServletResponseWrapper.java:626)
    at [email protected]//org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$DeferredOutputStream.flush(HttpServletResponseWrapper.java:263)
    at [email protected]//org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$FlushOperation.doWork(HttpServletResponseWrapper.java:160)
    at [email protected]//org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$AsyncOperation.work(HttpServletResponseWrapper.java:58)
    at [email protected]//org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$DeferredOutputStream.flushQueue(HttpServletResponseWrapper.java:331)
    at [email protected]//org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$DeferredOutputStream.queue(HttpServletResponseWrapper.java:313)
    at [email protected]//org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$DeferredOutputStream.asyncFlush(HttpServletResponseWrapper.java:274)
    at [email protected]//org.jboss.resteasy.plugins.providers.sse.SseEventOutputImpl.lambda$internalWriteEvent$5(SseEventOutputImpl.java:277)
    at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
    at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341)
    at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:144)
    at [email protected]//org.jboss.resteasy.plugins.providers.sse.SseEventOutputImpl.internalWriteEvent(SseEventOutputImpl.java:277)
    ... 155 more

从外观上看,这似乎是由 Undertow 中的一些超时设置引起的,我认为大约是一分钟左右。

有谁知道如何增加SSE连接的超时时间? Undertow 中的默认超时可能非常适合正常的 REST 调用。然而,对于 SSE 连接,特别是如果您要一次打开 100 个或更多连接,每分钟不断地断开连接并重新连接听起来不太有效。

这是我定义的端点:

    @GET
    @Path("publish/{token}")
    @Produces(SERVER_SENT_EVENTS)
    public void sseProcessed(@PathParam("token") final String token,
                             @Context final SseEventSink sink) {
        sseClientRegistry.add(Integer.parseInt(token), sink);
    }

sseClientRegistry 也来自我的代码,我们在其中保存当前 SSE 连接的列表。如果系统的某些部分触发事件,sseClientRegistry 会处理该事件并将消息发送到适当的连接。

除了由于超时导致连接过早关闭之外,该机制工作正常

java wildfly server-sent-events undertow
1个回答
0
投票

根据Undertow项目中的上面this行代码的注释,这种错误一般应该被抑制,所以这就是我所做的。这可以使用

jboss-cli.sh
:

来完成
$ ~/wildfly-31.0.1.Final/bin/jboss-cli.sh -c
[standalone@localhost:9990 /] /subsystem=logging/logger="io.undertow.request.io":add(level="FATAL")

或者通过编辑

standalone.xml
配置文件:

<logger category="io.undertow.request.io">
    <level name="FATAL"/>
</logger>
© www.soinside.com 2019 - 2024. All rights reserved.