2017-12-06 22 views
0

Docker 컨테이너 내에서 Spring 애플리케이션을 실행 중입니다. 우리의 응용 프로그램은 SVG 파일을 PDF 형식으로 변환하여 PDF에 포함 할 수 있습니다.Apache Batik 트랜스 코더 (도커 컨테이너 차단 포함)

응용 프로그램이 osx에서 올바르게 작동하고 예상대로 트랜스 코드됩니다. 그러나 다른 파일 시스템을 가진 도커 컨테이너 내부에서 실행하면 트랜스 코더가 멈추어 일부 기괴한 재귀 파일 검색 루프에서 CPU를 처리합니다.

java.lang.Thread.State: RUNNABLE 
    at java.io.UnixFileSystem.getBooleanAttributes0(Native Method) 
    at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:242) 
    at java.io.File.isFile(File.java:882) 
    at org.apache.commons.io.filefilter.FileFileFilter.accept(FileFileFilter.java:59) 
    at org.apache.commons.io.filefilter.AndFileFilter.accept(AndFileFilter.java:122) 
    at org.apache.commons.io.filefilter.AndFileFilter.accept(AndFileFilter.java:122) 
    at org.apache.commons.io.filefilter.OrFileFilter.accept(OrFileFilter.java:118) 
    at java.io.File.listFiles(File.java:1291) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:357) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364) 
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364 

다음은 PDFTranscoder를 실행 한 스레드의 스택 추적에 대한 것입니다. Walk는 잠시 동안 재귀 적으로 호출되고 결국에는 getBooleanAttributes0이 호출되고 모든 것이 차단됩니다.

추가 조사가 끝나면 strace 명령으로 어떤 일이 일어나는지 자세히 살펴보고 시스템이 본질적으로 다음과 같은 무한 루프에서 스팸을 보내는 것을 확인했습니다. PNP0103 : 00/subsystem/devices/PNP0103 : 00/subsystem/devices/

stat ("/./ sys/devices/pci0000 : 00/PNP0103 : 00/하위 시스템/장치/PNP0103 : PNP0103 : 00/subsystem/devices/PNP0103 : 00/subsystem/devices/PNP0103 : 00/subsystem/devices/PNP0103 : 00/subsystem/devices/PNP0103 : PNP0103 : 00/서브 시스템/장치/PNP0103 : 00/서브 시스템/장치/PNP0103 : 00/서브 시스템/장치/PNP0103 : 00/서브 시스템/(st_mode = S_IFREG | 0444, st_size = 4096, ...}) = 0 < 0.000224> 서브 시스템/장치/PNP0103 : 00/subsystem/devices/pcspkr/input/input1/subsystem/input0/subsystem/input0/uniq "

stat 호출이 차단되거나 걸려있는 것 같습니다. 그러나 우리는 시스템 호출에 대해 깊이 파고 들었으므로 이제는 디버깅하기가 어렵습니다. 누구든지 아이디어가 있습니까?

답변

0

나는 내 프로젝트에서 같은 문제가 있었다. 나는 1.7 버전으로 바틱의 다운 그레이드로 해결한다.

이 방법이 도움이되기를 바랍니다.

0

'-Duser.dir =/% CATALINA_HOME /'매개 변수를 CATALINA_OPTS에 추가해보십시오. 내 centos 서버에서 동일한 문제가 발생했습니다.

0

같은 문제가있었습니다. DockerFile에서 WORKDIR 변수를 설정하여 해결했습니다. spring jar 파일을 복사하는 배치 디렉토리로 설정했습니다. 즉

WORKDIR ${DEPLOYMENT_DIR} 

치어의 최신 바틱 라이브러리를 사용하여

<dependency> 
     <groupId>org.apache.xmlgraphics</groupId> 
     <artifactId>batik-all</artifactId> 
     <version>1.9.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.xmlgraphics</groupId> 
     <artifactId>fop</artifactId> 
     <version>2.2</version> 
    </dependency>