【问题标题】:Enabling Jersey trace logging causes MaxHeaderCountExceededException启用 Jersey 跟踪日志记录会导致 MaxHeaderCountExceededException
【发布时间】:2017-01-17 12:59:33
【问题描述】:

我正在尝试在 Payara 162 上调试我的 jersey 2 应用程序,但在每次请求时,在打印跟踪信息后我都会收到此异常并且客户端没有得到响应:

org.glassfish.grizzly.http.util.MimeHeaders$MaxHeaderCountExceededException: Illegal attempt to exceed the configured maximum number of headers: 100
at org.glassfish.grizzly.http.util.MimeHeaders.createHeader(MimeHeaders.java:396)
at org.glassfish.grizzly.http.util.MimeHeaders.addValue(MimeHeaders.java:422)
at org.glassfish.grizzly.http.HttpHeader.addHeader(HttpHeader.java:707)
at org.glassfish.grizzly.http.server.Response.addHeader(Response.java:1177)
at org.apache.catalina.connector.Response.addHeader(Response.java:1221)
at org.apache.catalina.connector.ResponseFacade.addHeader(ResponseFacade.java:579)
at org.glassfish.jersey.servlet.internal.ResponseWriter.writeResponseStatusAndHeaders(ResponseWriter.java:165)
at org.glassfish.jersey.server.ServerRuntime$Responder$1.getOutputStream(ServerRuntime.java:701)
at org.glassfish.jersey.message.internal.CommittingOutputStream.commitStream(CommittingOutputStream.java:200)
at org.glassfish.jersey.message.internal.CommittingOutputStream.flushBuffer(CommittingOutputStream.java:305)
at org.glassfish.jersey.message.internal.CommittingOutputStream.commit(CommittingOutputStream.java:261)
at org.glassfish.jersey.message.internal.CommittingOutputStream.close(CommittingOutputStream.java:276)
at org.glassfish.jersey.message.internal.OutboundMessageContext.close(OutboundMessageContext.java:839)
at org.glassfish.jersey.server.ContainerResponse.close(ContainerResponse.java:412)
at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:784)
at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444)
at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434)
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329)

在我的球衣中,我的应用程序是这样配置跟踪的:

public class RestApplication extends ResourceConfig {

public RestApplication() {
    super();
    packages(true, "com.example");
    register(JacksonFeature.class);
    register(JsonProvider.class);
    register(RolesAllowedDynamicFeature.class);

    property("jersey.config.server.tracing.type", "ON_DEMAND");
    property("jersey.config.server.tracing.threshold", "VERBOSE");
}

}

我在我的 logback.xml 中启用了记录器(我已将 Payara 配置为使用 logback),当我通过在我的请求中添加 X-Jersey-Tracing-Accept 标头按需启用它时,我会在我的服务器日志中看到完整的跟踪信息,但后来我得到了例外。当我不向请求中添加标头时,一切正常,但当然我没有得到跟踪。

我想知道是否有什么我可以改变来解决这个问题还是它是一个错误?

【问题讨论】:

    标签: jersey jersey-2.0 java-ee-7 glassfish-4 payara


    【解决方案1】:

    问题在于跟踪会为每个事件添加一个header into the REST response

    Grizzly 对响应中的标头数量施加了限制。 Payara 服务器默认将 100 定义为响应中的maximum number of headers。您需要增加此数字以允许响应中的所有跟踪信息。

    要设置更大的最大标头数,您需要使用 asadmin。在 GUI 管理控制台中没有设置此选项,屏幕中缺少用于配置 HTTP 协议的选项。

    如果你的配置是server-config,网络监听是http-listener-1,那么执行下面的asadmin命令设置为1000:

    asadmin> 设置 configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.max-response-headers=1000

    您可以使用类似的命令设置所有Grizzly network listener propertiesoptions,只需将max-response-headers替换为您要设置的选项的名称,使用-作为单词分隔符而不是驼峰式。

    【讨论】:

    • 感谢@OndrejM,我会试试的,虽然我很确定标题的数量是个位数,所以再添加 1 不会使其接近 100。
    • 是的,它成功了!我误解了您的回答,我以为您的意思是它会在响应中添加一个标头,但它会为“每个事件”添加 1 个标头,这实际上是很多很多额外的标头,这就是它超过 100 个的原因。谢谢!跨度>
    猜你喜欢
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2014-06-16
    相关资源
    最近更新 更多