윈도우즈의 서비스로 등록한 톰캣을 시작한 후 "catalina.시작일자.log"를 살펴보면 다음과 같은 오류가 발생할 때가 있다.

월 11, 2022 5:24:49 오후 org.apache.catalina.session.StandardManager doLoad
심각: IOException while loading persisted sessions: java.io.StreamCorruptedException: invalid type code: 00
java.io.StreamCorruptedException: invalid type code: 00
   at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1677)
   at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2365)
   at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:612)
   at java.lang.Throwable.readObject(Throwable.java:915)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:498)
   at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1185)
   at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2256)
   at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2147)
   at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646)
   at java.io.ObjectInputStream.readObject(ObjectInputStream.java:482)
   at java.io.ObjectInputStream.readObject(ObjectInputStream.java:440)
   at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1587)
   at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1075)
   at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:259)
   at org.apache.catalina.session.StandardManager.load(StandardManager.java:176)
   at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:465)
   at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
   at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5714)
   at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
   at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1018)
   at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:994)
   at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
   at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1296)
   at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:2039)
   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
   at java.util.concurrent.FutureTask.run(FutureTask.java:266)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
   at java.lang.Thread.run(Thread.java:748)

7월 11, 2022 5:24:49 오후 org.apache.catalina.session.StandardManager startInternal
심각: Exception loading sessions from persistent storage
java.io.StreamCorruptedException: invalid type code: 00
   at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1677)
   at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2365)
   at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:612)
   at java.lang.Throwable.readObject(Throwable.java:915)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:498)
   at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1185)
   at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2256)
   at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2147)
   at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646)
   at java.io.ObjectInputStream.readObject(ObjectInputStream.java:482)
   at java.io.ObjectInputStream.readObject(ObjectInputStream.java:440)
   at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1587)
   at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1075)
   at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:259)
   at org.apache.catalina.session.StandardManager.load(StandardManager.java:176)
   at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:465)
   at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
   at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5714)
   at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
   at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1018)
   at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:994)
   at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
   at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1296)
   at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:2039)
   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
   at java.util.concurrent.FutureTask.run(FutureTask.java:266)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
   at java.lang.Thread.run(Thread.java:748)

 

이때는 설정값을 변경하는 것도 있지만, ~CATALINA/work/Catalina/localhost 디렉토리에 위치한 모든 정보들을 삭제하고, 서비스를 재시작 또는 중지한 후에 시작을 하면 위와 같은 에러 로그는 출력되지 않는다.

Posted by 테리
:

해결은 -Dfile.encoding=UTF-8 이였다. (간단한 거)

    --JvmOptions "-Dcatalina.home=%CATALINA_HOME%;-Dcatalina.base=%CATALINA_BASE%;-D%ENDORSED_PROP%=%CATALINA_HOME%\endorsed;-Djava.io.tmpdir=%CATALINA_BASE%\temp;-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties;-Dfile.encoding=UTF-8;%JvmArgs%" ^

 

보통 사이트는 대부분 리눅스 또는 유닉스 환경이다.

 

이번에 특정 사이트가 윈도우 서버이기에 연구소 설치 담당자가 작성한 윈도우 서비스 설치 가이드대로 설치가 되었으나, 데이터를 받으면 이상하게 한글이 깨지는 현상이 발생하였다.

이미 다른 사이트를 통해서 윈도우 서버에 윈도우 서비스로 등록을 하여 데이터에 대한 한글이 깨지지 않음을 확인이 되었기에 살짝 황당하였다.

그래서 기존의 내가 알고 있는 방식으로 톰캣의 인코딩 설정 정보를 확인 및 추가해 보았으나 해결 방안이 되지 못한 상태로 지난 주를 마무리를 지었다.

그래서 한번 더 확인을 해 본 결과 JvmOptions에 -Dfile.encoding=UTF-8 옵션을 추가하는 방법이 있어서 service.bat의 JvmOptions의 맨 마지막에 위와 같은 옵션을 추가를 하였으나, 여전히 데이터의 한글은 깨져서 도출이 되었다. (-Dfile.encoding=UTF-8 옵션은 알고는 있었으나 무작적 옵션의 맨 마지막에 추가를 했던 거이였다. 하기와 같이)

    --JvmOptions "-Dcatalina.home=%CATALINA_HOME%;-Dcatalina.base=%CATALINA_BASE%;-D%ENDORSED_PROP%=%CATALINA_HOME%\endorsed;-Djava.io.tmpdir=%CATALINA_BASE%\temp;-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties;%JvmArgs%;-Dfile.encoding=UTF-8" ^

 

이에 옆 동료(이전 회사에서 자사의 솔류션을 설치 등등을 전문적으로 담당했었다) 직원의 권유로 다음과 같은 명령어로 JvmOptions를 추가해 보았다.

tomcat7 //US//{Service_Name} ++JvmOptions=-Dfile.encoding="UTF-8" 

 

결과는 만족, 데이터의 한글이 깨짐 없이 정상적으로 출력이 되었던 것이였다.

궁금했었다. 분명히 JvmOptions의 마지막에 관련 옵션을 추가하였기 때문이다.

혹시나 해서 이거 저거 중에 설정한 값을 바꿔보았다.

;-Dfile.encoding=UTF-8;%JvmArgs%" ^

 

음.. 데이터의 한글이 정상적으로 출력이 되는 것이였다.

이 JvmArgs 가 무엇인지 확인해 볼려고 했으나, 관련 정보는 보이지 않고, 또한 service.bat의 JvmArgs가 set으로도 설정이 되어 있지 않음을 확인하였다.

아마도 여기서 문제가 발생하여 -Dfile.encoding=UTF-8 옵션 설정이 잡히지 않은 것으로 판단이 된다.

 

아무튼 큰 이슈 해결을 찾은 것은 아니였나, 지난 주 부터 오늘까지 반나절을 소비했는 부분이라 글로 남겨 보왔다.

Posted by 테리
: