启用 Jersey 跟踪日志记录会导致 MaxHeaderCountExceededException
Enabling Jersey trace logging causes MaxHeaderCountExceededException
我正在尝试在 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.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.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),当我通过添加 [=12= 按需启用它时,我在服务器日志中看到了完整的跟踪信息] header 我的请求,但后来我得到了异常。当我不将 header 添加到请求时,一切正常,但当然我没有得到跟踪。
我想知道是否有任何我可以更改的内容来解决这个问题,或者这是一个错误?
问题是跟踪会为每个事件添加一个 header into the REST response。
Grizzly 对响应中 headers 的数量施加了限制。
Payara Server 默认在响应中将 100 定义为 maximum number of headers
。您需要增加此数字以允许响应中的所有跟踪信息。
要为 headers 的最大数量设置更高的数字,您需要使用 asadmin。在 GUI 管理控制台中没有设置此选项的选项,配置 HTTP 协议的屏幕中缺少此选项。
如果您的配置名为 server-config
并且网络侦听器为 http-listener-1
,则执行以下 asadmin 命令将其设置为 1000:
asadmin> set
configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.max-response-headers=1000
你可以使用类似的命令来设置所有Grizzly network listener propertiesoptions,只需将max-response-headers
替换为你要设置的选项的名称,使用-
作为单词分隔符而不是骆驼案。
我正在尝试在 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.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.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),当我通过添加 [=12= 按需启用它时,我在服务器日志中看到了完整的跟踪信息] header 我的请求,但后来我得到了异常。当我不将 header 添加到请求时,一切正常,但当然我没有得到跟踪。
我想知道是否有任何我可以更改的内容来解决这个问题,或者这是一个错误?
问题是跟踪会为每个事件添加一个 header into the REST response。
Grizzly 对响应中 headers 的数量施加了限制。
Payara Server 默认在响应中将 100 定义为 maximum number of headers
。您需要增加此数字以允许响应中的所有跟踪信息。
要为 headers 的最大数量设置更高的数字,您需要使用 asadmin。在 GUI 管理控制台中没有设置此选项的选项,配置 HTTP 协议的屏幕中缺少此选项。
如果您的配置名为 server-config
并且网络侦听器为 http-listener-1
,则执行以下 asadmin 命令将其设置为 1000:
asadmin> set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.max-response-headers=1000
你可以使用类似的命令来设置所有Grizzly network listener propertiesoptions,只需将max-response-headers
替换为你要设置的选项的名称,使用-
作为单词分隔符而不是骆驼案。