2016-03-09 3 views
9

ПРЕДУПРЕЖДЕНИЯ - причина не отсутствующий файл - ВСЕ НИТИ вызывают ЖЕ SCRIPT ФАЙЛАApache Commons Exec - иногда тема не может открыть локальный файл в Linux

Я начинаю 5- 6 потоков, которые вызывают локальный скрипт в поле Red Hat.

Я заметил, что иногда, я получаю следующее сообщение об ошибке

Очевидно, что все процессы выполнения сценария, так что кажется, что-то связанное с [1] OS имеет некоторое ограничение на одновременное процессы, которые могут запускать скрипт или доступ к файлу для чтения или [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(""); 
} 

Если ошибка [1], то я хотел бы знать, как ослабить это ограничение в ОС Linux

Если ошибка [2], то я хотел бы знать, как я могу сказать commons-exec ждать, пока ресурс будет готов (в худшем случае я просто добавлю несколько попыток, но я думаю, что это не очень элегантно)

Если ошибка - это что-то еще, по крайней мере, зная причину, будьте достаточно хороши, чтобы найти какое-то решение.

ОБНОВЛЕНИЕ - 15 марта

Ну, вот в чем дело.

Сценарий сценария ожидания, который использует библиотеку для вызова класса Java.

Одна вещь, которую я заметил, это то, что сценарий идет хорошо, пока не вызывает метод java, который создает соединение с базой данных.

Поскольку количество потоков невелико (3 ~ 5), я не думаю, что это проблема в базе данных. Вместо этого мне кажется, что что-то блокирует сценарий, вызываемый при вызове Java-кода, и/или пока Java-код создает соединение с базой данных.

Я до сих пор пытаются получить точное исключение, но ожидать сценарий выглядит следующим образом (вид)

#!/opt/tclblend/bin/expect -f 
set edfDir "/usr/local/nssa/bin/edf"; 
set env(LD_LIBRARY_PATH) "/opt/tclblend/lib/tcljava1.4.1"; # for tclBlend 

## always use absolute paths 
set env(TCL_CLASSPATH) "/home/leoks/EclipseIndigo/workspace2/xyzJavaWrapper/bin"; 
set env(CLASSPATH) {/home/leoks/EclipseIndigo/workspace2/xyzTomEE/lib/commons-logging-1.1.1.jar:/home/leoks/EclipseIndigo/workspace2/xyzConfiguration/lib/commons-configuration-1.9.jar:/home/leoks/EclipseIndigo/workspace2/xyzConfiguration/lib/commons-lang-2.4.jar:/home/leoks/EclipseIndigo/workspace2/xyz/3rdPartyJDBCJars/ojdbc6.jar:/home/leoks/EclipseIndigo/workspace2/xyzJavaWrapper/lib/commons-dbutils-1.5.jar:/home/leoks/EclipseIndigo/workspace2/xyzJavaWrapper/tcl/tcllib/xyzConfiguration.jar}; 

source $edfDir/lib/statics.tcl; 
source $edfDir/lib/acclib.tcl; 

package require java 

java::import com.abc.xyz.legacydriver.TCLDriverWrapper 
java::import com.abc.xyz.legacydriver.LegacyDriverTaskInputData 
java::import com.abc.xyz.legacydriver.LegacyDriverTaskEnum 

set ticket [ lindex $argv 0 ]; 
set inputData [ java::call com.abc.xyz.legacydriver.TCLDriverWrapper pullNextInputData $ticket ] 

где 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); 
    } 
} 

и GetConnection() это просто обычный код создания экземпляра драйвера, такой как (используется apache dbutils)

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); 
} 

Как только Я получаю трассировку стека, я положу его здесь

ОБНОВЛЕНИЕ - 16 марта

StackTrace не говорит много :-(

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) 
+0

@ Kenster проблема в том, что мой код работает в 10 разных потоках, и он работает в 9 из них, но не работает в 1. Очевидно, не в том, что файл не существует, и я ясно дал понять в вопросе – Leo

+0

Кстати, почему нисходящий, кто-то? – Leo

+0

Является ли 'cmd' константой? Покажите нам содержимое 'cmd'. И было бы полезно увидеть фактическую ошибку со своим стеклом. – Roman

ответ

1

Я хотел бы поблагодарить всех людей, которые помогли в этом случае.

Я бы удалил этот вопрос, но поскольку я надел на него щедрость, я не могу. (возможно, когда щедрость истечет, если SO позволит мне это сделать, я сделаю это)

Наконец-то я нашел способ не иметь проблемы, и, похоже, это связано с тем, как было распределено приложение ресурсов для потоков, поэтому, учитывая информацию, предоставленную в вопросе, я думаю, что невозможно было выяснить основную причину.

В любом случае, я попытаюсь описать здесь, что произошло.

enter image description here (нажмите, чтобы увеличить)

Проблема была я заметил в (5) (6) (7). Но причина была в (3).

Конфигурация TomEE для пула потоков, который обслуживает @Asynchronous методы, имеет меньше потоков (мое приложение не использует значения по умолчанию), чем необходимо, поэтому кажется, что какой-то ресурс истощается.

Также появляется сообщение об ошибке, которое я еще не определил, поэтому даже сообщение об ошибке может быть недействительным в этом случае.

Поскольку у вопроса были не все переменные, необходимые для его разрешения, я предоставляю здесь полное объяснение проблемы.

Поскольку это код клиента, я не могу сделать код доступным или предоставить всю информацию. Даже имена пакетов должны были быть запутаны.

Опять же, я хотел бы поблагодарить всех, кто проводил время, пытаясь помочь здесь, и я хотел бы извиниться за то, что не предоставил все необходимые данные.