0

我目前正在 Wildfly 中使用 RESTEasy 处理服务器发送事件。到目前为止,一切正常,除了有时 SSE 实现无法以某种方式识别监听事件的客户端已经关闭(也SseEventSource调用了客户端的 close() 方法)。在程序逻辑方面,这根本不是问题。

但不幸org.jboss.resteasy.plugins.providers.sse.SseEventOutputImpl的是,用于发送事件的类 - 除了将异常报告回org.jboss.resteasy.plugins.providers.sse.SseBroadcasterImpl- 不仅报告异常,而且还使用(后面的类基于 JBoss 日志记录)的failedToWriteSseEvent(String, Throwable)方法记录它。org.jboss.resteasy.resteasy_jaxrs.i18n.LogMessages所以我时不时地在错误级别上收到一条不必要的日志消息,告诉我连接已被客户端关闭。除了我从SseBroadcaster.

配置 JBoss 日志记录似乎是不可能的,因为日志名称org.jboss.resteasy.resteasy_jaxrs.i18n也用于记录其他错误(意味着仅在部署的 log4j.xml 中配置记录器将不起作用/还会关闭其他错误)。

2021-06-22 12:59:27 [ERROR] [org.jboss.resteasy.resteasy_jaxrs.i18n:272] - RESTEASY002030: Failed to write event org.jboss.resteasy.plugins.providers.sse.OutboundSseEventImpl@fd79b33
java.io.IOException: An existing connection was forcibly closed by the remote host
    at sun.nio.ch.SocketDispatcher.writev0(Native Method)
    at sun.nio.ch.SocketDispatcher.writev(Unknown Source)
    at sun.nio.ch.IOUtil.write(Unknown Source)
    at sun.nio.ch.SocketChannelImpl.write(Unknown Source)
    at org.xnio.nio.NioSocketConduit.write(NioSocketConduit.java:162)
    at io.undertow.server.protocol.http.HttpResponseConduit.write(HttpResponseConduit.java:647)
    at io.undertow.conduits.ChunkedStreamSinkConduit.doWrite(ChunkedStreamSinkConduit.java:166)
    at io.undertow.conduits.ChunkedStreamSinkConduit.write(ChunkedStreamSinkConduit.java:128)
    at org.xnio.conduits.ConduitStreamSinkChannel.write(ConduitStreamSinkChannel.java:150)
    at io.undertow.channels.DetachableStreamSinkChannel.write(DetachableStreamSinkChannel.java:240)
    at io.undertow.server.HttpServerExchange$WriteDispatchChannel.write(HttpServerExchange.java:2103)
    at io.undertow.servlet.spec.ServletOutputStreamImpl.writeBufferBlocking(ServletOutputStreamImpl.java:574)
    at io.undertow.servlet.spec.ServletOutputStreamImpl.flushInternal(ServletOutputStreamImpl.java:489)
    at io.undertow.servlet.spec.ServletOutputStreamImpl.flush(ServletOutputStreamImpl.java:476)
    at io.undertow.servlet.spec.HttpServletResponseImpl.flushBuffer(HttpServletResponseImpl.java:468)
    at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:221)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper.flushBuffer(HttpServletResponseWrapper.java:124)
    at org.jboss.resteasy.plugins.providers.sse.SseEventOutputImpl.writeEvent(SseEventOutputImpl.java:264)
    at org.jboss.resteasy.plugins.providers.sse.SseEventOutputImpl.send(SseEventOutputImpl.java:199)
    at org.jboss.resteasy.plugins.providers.sse.SseBroadcasterImpl.lambda$null$4(SseBroadcasterImpl.java:150)
    at java.lang.Iterable.forEach(Unknown Source)
    at org.jboss.resteasy.plugins.providers.sse.SseBroadcasterImpl.lambda$broadcast$5(SseBroadcasterImpl.java:146)
    at java.util.concurrent.CompletableFuture$AsyncRun.run(Unknown Source)
    at java.util.concurrent.CompletableFuture$AsyncRun.exec(Unknown Source)
    at java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(Unknown Source)
    at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
    at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)

有没有办法控制 RESTEasy 中的日志记录并禁用日志记录failedToWriteSseEvent(String, Throwable)?就像引入/注入自己的实现LogMessages(但据我所知,接口被用作代理,所以......)?

4

1 回答 1

1

您可能正在点击RESTEASY-1986。不过,您可以使用日志过滤器过滤掉这些。在 CLI 中类似于:

/subsystem=logging/logger=org.jboss.resteasy.resteasy_jaxrs.i18n:add(filter-spec=not(match(".*RESTEASY002030.*")), level=INFO)
于 2021-06-22T15:58:06.397 回答