我写的是需要使用使用Apache下议院Exec的图书馆外部命令行应用程序的Java应用程序命令提供多种输入。我需要运行的应用程序有一个相当长的加载时间,所以最好让一个实例保持活动状态,而不是每次都创建一个新进程。应用程序的工作方式非常简单。一旦启动,它会等待一些新的输入并生成一些数据作为输出,这两者都使用应用程序的标准I/O。麻烦使用Apache下议院Exec和提取输出
这样的想法。将执行命令行,然后使用具有三个独立的数据流(输出,错误和输入)PumpStreamHandler并使用这些流,以与应用程序交互。到目前为止,我已经在基本场景中完成了这项工作,其中我有一个输入,一个输出,然后应用程序关闭。但只要我尝试进行第二笔交易,就会出现问题。
在已经建立了我的CommandLine,创建我的遗嘱执行人,并启动它,像这样:
this.executor = new DefaultExecutor();
PipedOutputStream stdout = new PipedOutputStream();
PipedOutputStream stderr = new PipedOutputStream();
PipedInputStream stdin = new PipedInputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler(stdout, stderr, stdin);
this.executor.setStreamHandler(streamHandler);
this.processOutput = new BufferedInputStream(new PipedInputStream(stdout));
this.processError = new BufferedInputStream(new PipedInputStream(stderr));
this.processInput = new BufferedOutputStream(new PipedOutputStream(stdin));
this.resultHandler = new DefaultExecuteResultHandler();
this.executor.execute(cmdLine, resultHandler);
我再继续推出三个不同的线程,每一个处理不同的流。我还有三个处理输入和输出的SynchronousQueues(一个用作输入流的输入,一个用于通知outputQueue一个新命令已启动,一个用于输出)。例如,输入流线看起来是这样的:
while (!killThreads) {
String input = inputQueue.take();
processInput.write(input.getBytes());
processInput.flush();
IOQueue.put(input);
}
如果我删除了while循环,只是执行此一次,一切似乎都很好地工作。显然,如果我再次尝试执行它,PumpStreamHandler将抛出一个异常,因为它已被两个不同的线程访问。
这里的问题是,它似乎像processInput是不是真正的刷新,直到线程结束。调试时,命令行应用程序只有在线程结束后才真正接收输入,但如果保留while循环,则永远不会获取输入。我已经尝试了许多不同的东西来让processInput刷新,但似乎没有任何工作。
有没有人尝试过类似的东西?有什么我失踪?任何帮助将不胜感激!
你应该为你的帖子添加一个java标签,以便为你的问题提供最有经验的“眼睛”。祝你好运。 – shellter