본문 바로가기
Web Application Server

JBWEB000065: HTTP Status 500 - java.lang.NumberFormatException: For input string

강철지그·2015년 11월 20일·조회 6,056

JBoss 6.2 EAP 기반 모니터링 툴을 사용하던 중 다음과 같은 오류가 발생했습니다.

JBWEB000065: HTTP Status 500 - java.lang.NumberFormatException: For input string: "83641786051"

--------------------------------------------------------------------------------

JBWEB000309: type JBWEB000066: Exception report

JBWEB000068: message java.lang.NumberFormatException: For input string: "83641786051"

JBWEB000069: description JBWEB000145: The server encountered an internal error that prevented it from fulfilling this request.

JBWEB000070: exception

org.apache.jasper.JasperException: java.lang.NumberFormatException: For input string: "83641786051"
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:409)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:309)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:242)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
JBWEB000071: root cause

java.lang.NumberFormatException: For input string: "83641786051"
        java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        java.lang.Integer.parseInt(Integer.java:495)
        java.lang.Integer.parseInt(Integer.java:527)
        org.jboss.dmr.StringModelValue.asInt(StringModelValue.java:139)
        org.jboss.dmr.ModelNode.asInt(ModelNode.java:240)
        org.jboss.as.jmx.model.TypeConverters$IntegerValueAccessor.fromModelNode(TypeConverters.java:778)
        org.jboss.as.jmx.model.TypeConverters$SimpleTypeConverter.fromModelNode(TypeConverters.java:223)
        org.jboss.as.jmx.model.TypeConverters.fromModelNode(TypeConverters.java:114)
        org.jboss.as.jmx.model.ModelControllerMBeanHelper.getAttribute(ModelControllerMBeanHelper.java:255)
        org.jboss.as.jmx.model.ModelControllerMBeanHelper.getAttribute(ModelControllerMBeanHelper.java:210)
        org.jboss.as.jmx.model.ModelControllerMBeanServerPlugin.getAttribute(ModelControllerMBeanServerPlugin.java:94)
        org.jboss.as.jmx.PluggableMBeanServerImpl.getAttribute(PluggableMBeanServerImpl.java:382)
        org.apache.jsp.wasmon_005f62_jsp._jspService(wasmon_005f62_jsp.java:268)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:69)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:365)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:309)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:242)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
JBWEB000072: note JBWEB000073: The full stack trace of the root cause is available in the JBoss Web/7.2.2.Final-redhat-1 logs.

원인 분석

정확한 원인을 찾기 위해 wasmon_005f62_jsp.java 파일을 분석해 보았습니다.

컴파일된 Java 파일과 stack trace를 확인해 보니, Connector의 bytesSent 값(Runtime)을 가져오는 부분에서 오류가 발생하고 있었습니다. JBoss 6.2 EAP의 Connector 소스(WebConnectorMetrics.class)를 확인해 보니 bytesSentbytesReceived는 다음과 같이 Integer 형식으로 관리되고 있습니다.

  protected static final SimpleAttributeDefinition BYTES_SENT =
    new SimpleAttributeDefinitionBuilder("bytesSent", ModelType.INT, true).setStorageRuntime().build();
  protected static final SimpleAttributeDefinition BYTES_RECEIVED =
    new SimpleAttributeDefinitionBuilder("bytesReceived", ModelType.INT, true).setStorageRuntime().build();

오류 메시지에 따르면 "83641786051" 값을 Integer.parseInt로 변환하다가 Exception이 발생했습니다. 당시 bytesSent 값인 83641786051은 Java의 Integer 최대값인 2147483647을 벗어나기 때문에 NumberFormatException이 발생한 것입니다.

Tomcat과의 차이

참고로 Tomcat은 이 값들을 long으로 관리하고 있어 더 큰 범위의 데이터 처리에도 같은 형태의 Exception이 발생하지 않습니다.

    // -------------------- Statistical data  --------------------
    // Collected at the end of each request.
    private long bytesSent;
    private long bytesReceived;

확인 및 대응 방향

동일한 문제가 의심된다면 stack trace에서 Integer.parseInt, ModelNode.asInt, TypeConverters$IntegerValueAccessor 호출 여부를 확인하고, 문제가 발생한 JSP 또는 모니터링 코드가 Connector의 bytesSent, bytesReceived 값을 조회하는지 점검하면 됩니다.

근본적으로는 해당 런타임 값이 int 범위를 넘을 수 있다는 점을 고려해야 합니다. 모니터링 도구에서 값을 직접 파싱하거나 표시하는 부분이 있다면 int가 아닌 long 기준으로 처리하도록 수정하는 것이 안전합니다. 다만 JBoss 6.2 EAP 내부에서 해당 attribute가 ModelType.INT로 정의되어 있다면, JMX를 통해 조회하는 시점에 이미 변환 오류가 발생할 수 있으므로 운영 환경에서는 누적 값이 커지기 전에 재기동 또는 모니터링 방식 변경도 함께 검토해야 합니다.

End.

관련 글

댓글 0

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.