Java Apache Commons Exec—有时线程可以';不要在Linux中打开本地文件
警告--原因不是缺少文件--所有线程都在调用同一个脚本文件 我正在启动5-6个线程,它们调用红帽盒中的本地脚本 我注意到,有时会收到以下错误消息Java Apache Commons Exec—有时线程可以';不要在Linux中打开本地文件,java,linux,multithreading,apache-commons-exec,Java,Linux,Multithreading,Apache Commons Exec,警告--原因不是缺少文件--所有线程都在调用同一个脚本文件 我正在启动5-6个线程,它们调用红帽盒中的本地脚本 我注意到,有时会收到以下错误消息 couldn't read file "/home/leo/myScript.exp": no such file or directory 显然,所有进程都在执行脚本,因此似乎与[1]操作系统对可以运行脚本或访问文件以进行读取的同步进程有一些限制,或者[2]Java试图在未准备好的流中执行某些操作有关(我假设commons exec会为我处理此问题
couldn't read file "/home/leo/myScript.exp": no such file or directory
显然,所有进程都在执行脚本,因此似乎与[1]操作系统对可以运行脚本或访问文件以进行读取的同步进程有一些限制,或者[2]Java试图在未准备好的流中执行某些操作有关(我假设commons exec会为我处理此问题)
这是密码
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
CommandLine commandline = CommandLine.parse("/home/leo/myScript.exp");
DefaultExecutor exec = new DefaultExecutor();
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
exec.setStreamHandler(streamHandler);
try {
exec.execute(commandline); <<< error happens here
}catch(IOException io) {
throw new Exception("");
}
pullNextInputData看起来像什么
public static LegacyDriverTaskInputData pullNextInputData(String token) throws Exception {
try {
return pullNextInputDataImpl(token);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
private static LegacyDriverTaskInputData pullNextInputDataImpl(String token) throws Exception {
Connection conn = null;
try{
conn = new TCLDriverWrapper().getConnection();
QueryRunner run = new QueryRunner();
ResultSetHandler<LegacyDriverTaskInputData> rsh = new BeanHandler<LegacyDriverTaskInputData>(LegacyDriverTaskInputData.class);
LegacyDriverTaskInputData inputData = run.query(conn,"select * from LegacyDriverTask where id = ?",rsh,Long.valueOf(token));
return inputData;
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw e;
} catch (SQLException e) {
e.printStackTrace();
throw e;
} finally {
DbUtils.close(conn);
}
}
我一得到stacktrace就把它放在这里
更新-3月16日
stacktrace没有说太多:-(
我要感谢所有在这个案件中提供帮助的人 我想删除这个问题,但因为我已经悬赏了,所以我不能(也许悬赏期满后,如果允许的话,我会这么做) 我终于找到了解决问题的方法,这似乎与应用程序为线程分配资源的方式有关,因此根据问题中提供的信息,我认为不可能找出根本原因 无论如何,我会在这里描述发生了什么 (点击放大) 问题是我注意到了第(5)(6)(7)条,但原因是第(3)条 为@Asynchronous方法提供服务的线程池的TomEE配置的线程数(我的应用程序没有使用默认值)比需要的少,因此似乎有些资源不足 此外,错误消息似乎有一些我尚未识别的错误,因此在这种情况下,即使是错误消息也可能无效 因为这个问题没有解决它所需要的所有变量,我在这里提供了一个关于这个问题的完整解释 由于这是一个客户端代码,我无法提供代码,也无法提供所有信息,甚至连包名都必须混淆
再一次,我要感谢所有花时间在这里帮助我的人,我要为没有提供所有必要的数据而道歉。@Kenster问题是我的代码在10个不同的线程中运行,其中9个线程可以工作,但在1个线程中失败。显然不是文件不存在,我在问题中已经明确指出,为什么ownvote,有人吗?
IOException
是否有任何进入Apache代码的堆栈跟踪?也许确定错误发生的位置,然后读取源代码可以澄清一些事情。@Leo-只是一个想法,但是/home/Leo/myScript.exp
是否做了任何可能影响其自身运行方式的事情?“没有这样的文件或目录“是标准的unix操作系统错误消息。如果要在运行代码的JVM上运行strace-f
,则当程序发出此错误时,您可能能够识别实际失败的系统调用。strace输出将包括系统调用的参数,包括访问的文件名。”。
public static LegacyDriverTaskInputData pullNextInputData(String token) throws Exception {
try {
return pullNextInputDataImpl(token);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
private static LegacyDriverTaskInputData pullNextInputDataImpl(String token) throws Exception {
Connection conn = null;
try{
conn = new TCLDriverWrapper().getConnection();
QueryRunner run = new QueryRunner();
ResultSetHandler<LegacyDriverTaskInputData> rsh = new BeanHandler<LegacyDriverTaskInputData>(LegacyDriverTaskInputData.class);
LegacyDriverTaskInputData inputData = run.query(conn,"select * from LegacyDriverTask where id = ?",rsh,Long.valueOf(token));
return inputData;
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw e;
} catch (SQLException e) {
e.printStackTrace();
throw e;
} finally {
DbUtils.close(conn);
}
}
private Connection getConnectionImpl() throws Exception{
Class.forName("driver name");
Properties props = new Properties();
props.put("user", UtilConf.getProperty("javawrapper.user"));
props.put("password", UtilConf.getProperty("javawrapper.password"));
return DriverManager.getConnection(UtilConf.getProperty("javawrapper.jdbc"), props);
}
2016-03-17 01:49:10,034 INFO [QProcessor] Threads started (ok=0 nok=0 wait=0) org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1)
at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:404)
at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:166)
at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:153)
at com.ericsson.xyz.tomee.q.QWorker.onMessageImpl(QWorker.java:776)
at com.ericsson.xyz.tomee.q.QWorker.onMessage(QWorker.java:303)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:182)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:164)
at org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:180)
at org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:99)
at sun.reflect.GeneratedMethodAccessor106.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:182)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:164)
at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:80)
at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:212)
at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:181)
at org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:268)
at org.apache.openejb.core.ivm.EjbObjectProxyHandler$1.call(EjbObjectProxyHandler.java:253)
at org.apache.openejb.async.AsynchronousPool$AsynchronousCall.call(AsynchronousPool.java:110)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)