相关疑难解决方法(0)

Jersey 服务器发送事件 - 写入断开的连接不会引发异常

我们使用 Jersey 服务器发送事件 (SSE) 来允许应用程序的远程组件侦听 Jersey/Tomcat 服务器引发的事件。这很好用。

然而,至关重要的是我们的服务器拥有当前连接的侦听器(我们的远程组件)的准确列表。为此,我们的服务器每五秒向每个调用者发送一条小消息(通过 eventOutput.write)。如果我们的远程组件在 SSE 连接时关闭,或者远程计算机在 SSE 连接时关闭,我们服务器的 eventOutput.write 会抛出如下所示的 ClientAbortException/SocketException 异常。这很完美:我们捕获异常,将该调用者标记为不再连接,然后继续。

现在,针对问题。正如我所提到的,如果我们的远程组件软件未运行,或者运行该软件的计算机已关闭,则 eventOutput.write 会引发异常。但是,在两种情况下,对不再连接的计算机调用 eventOutput.write 不会引发异常:1) 如果在调用者连接 SSE 时简单地拔出远程计算机的以太网电缆,以及 2) 如果当调用者通过 SSE 连接时,远程计算机中的网络适配器被关闭(即通过管理操作)。在这两种情况下,我们可以在几个小时内每五秒调用一次 eventOutput.write 到远程计算机,并且不会引发异常。这使得无法检测到远程计算机不再连接。

我看到 EventOutput (和 ChunkedOutput) 的方法和属性非常少,但我想知道是否有任何方法可以配置或使用它,从而在写入已通过以太网断开连接的远程计算机时引发异常电缆已拔出或网络适配器已关闭。

这是在 eventOutput.write 确实抛出我们想要的异常的情况下得到的(好/有用)异常:

org.apache.catalina.connector.ClientAbortException: null
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:371) ~[catalina.jar:7.0.53]
    at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:333) ~[catalina.jar:7.0.53]
    at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:101) ~[catalina.jar:7.0.53]
    at org.glassfish.jersey.servlet.internal.ResponseWriter$NonCloseableOutputStreamWrapper.flush(ResponseWriter.java:303) ~[jaxrs-ri-2.13.jar:2.13.]
    at org.glassfish.jersey.message.internal.CommittingOutputStream.flush(CommittingOutputStream.java:292) ~[jaxrs-ri-2.13.jar:2.13.]
    at org.glassfish.jersey.server.ChunkedOutput$1.call(ChunkedOutput.java:240) ~[jaxrs-ri-2.13.jar:2.13.]
    at org.glassfish.jersey.server.ChunkedOutput$1.call(ChunkedOutput.java:190) ~[jaxrs-ri-2.13.jar:2.13.]
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[jaxrs-ri-2.13.jar:2.13.]
    at org.glassfish.jersey.internal.Errors.process(Errors.java:242) ~[jaxrs-ri-2.13.jar:2.13.]
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:347) ~[jaxrs-ri-2.13.jar:2.13.]
    at org.glassfish.jersey.server.ChunkedOutput.flushQueue(ChunkedOutput.java:190) ~[jaxrs-ri-2.13.jar:2.13.]
    at org.glassfish.jersey.server.ChunkedOutput.write(ChunkedOutput.java:180) ~[jaxrs-ri-2.13.jar:2.13.]
    at com.appserver.webservice.AgentSsePollingManager$ConnectionChecker.run(AgentSsePollingManager.java:174) ~[AgentSsePollingManager$ConnectionChecker.class:na] …
Run Code Online (Sandbox Code Playgroud)

java jersey server-sent-events jersey-2.0

5
推荐指数
1
解决办法
1555
查看次数

服务器与Jersey发送事件:客户端丢弃后,EventOutput未关闭

我正在使用球衣来实施SSE场景.

服务器保持连接活动.并定期将数据推送给客户.

在我的方案中,存在连接限制,只有一定数量的客户端可以同时订阅服务器.

因此,当新客户端尝试订阅时,我会进行检查(EventOutput.isClosed)以查看是否有任何旧连接不再处于活动状态,因此可以为新连接腾出空间.

但EventOutput.isClosed的结果始终为false,除非客户端显式调用EventSource的close.这意味着如果客户端意外掉线(断电或互联网截止),它仍然会占用连接,新客户端无法订阅.

有没有解决这个问题?

java rest jersey persistent-connection server-sent-events

1
推荐指数
1
解决办法
1910
查看次数