2015-02-03 8 views
0

기본 구현 인 camel's exec component을 사용하여 Windows 환경에서 배치 파일을 호출합니다. 배치 파일 실행이 실패하고 오류 메시지와 함께 0이 아닌 종료 코드가 반환 될 때마다 내 경로는 정상적으로 작동합니다. 하지만 실행이 성공할 때마다 다음과 같이 IOException이 발생합니다.camel exec 구성 요소를 사용하여 배치 파일을 호출하는 동안 IOException 가져 오기

org.apache.camel.component.exec.ExecException: Unable to execute command ExecCommand [args=[/C, d:\file.bat, test_request.xml, null], executable=cmd, timeout=5000, outFile=null, workingDir=null, useStderrOnEmptyStdout=false] 
at org.apache.camel.component.exec.impl.DefaultExecCommandExecutor.execute(DefaultExecCommandExecutor.java:81) 
at org.apache.camel.component.exec.ExecProducer.process(ExecProducer.java:46) 
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) 
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:120) 
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) 
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
at org.apache.camel.component.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:150) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) 
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684) 
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503) 
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086) 
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429) 
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) 
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 
at org.eclipse.jetty.server.Server.handle(Server.java:366) 
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494) 
at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982) 
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043) 
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865) 
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240) 
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) 
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53) 
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.io.IOException: Stream Closed 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(Unknown Source) 
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source) 
    at java.io.BufferedOutputStream.flush(Unknown Source) 
    at java.io.FilterOutputStream.close(Unknown Source) 
    at org.apache.commons.exec.DefaultExecutor.closeStreams(DefaultExecutor.java:288) 
    at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:364) 
    at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:160) 
    at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:147) 
    at org.apache.camel.component.exec.impl.DefaultExecCommandExecutor.execute(DefaultExecCommandExecutor.java:67) 
    ... 30 more 

이상하게도 충분히 일식 IDE에서 내 항아리를 실행할 때마다 모든 것이 잘 작동합니다. 하지만 "java -jar"를 사용하여 명령 프롬프트에서 배포 할 때마다 배치 파일 처리가 성공적으로 완료된 경우에만 위의 예외가 발생합니다. 많은 연구를하면서이 문제는 Java 런타임에서 사용하는 스트림과 관련이 있다고 생각하지만 근본 원인을 알 수는 없습니다. ExecBinding.EXEC_COMMAND_OUT_FILE을 사용하여 out 파일을 제공하려고 시도했지만 내 문제가 해결되지 않았습니다.

답변

0

문제는 내가 낙타 임원을 부르는 방식과 관련이 있습니다. 내가 뭘 사용 된 것은이었다 -

cmd /C <path_to_batch_file> param 

문제에 깊이 파고되면, 나는 C가, 새 명령 프롬프트 인스턴스를 생성하여 실행 한 후 과정을 파괴 할/깨달았다. 이것은 스트림을 어딘가에 닫고 낙타가 예외를 던지게했습니다. 해결책은 런타임에 컨트롤을 반환하는/K 스위치를 사용하는 것이 었습니다.

cmd /K <path_to_batch_file> param 
관련 문제