2012-03-13 5 views
0

У меня есть странная проблема с использованием JACOB из двух последовательно начинающихся одинаковых потоков. У меня есть класс утилиты, который использует статическое поле ActiveXObject для отправки различных запросов в WMI. Первый поток отлично работает. При запуске второй нити я получаю следующее исключение:Библиотека JACOB терпит неудачу при использовании в нескольких потоках

com.jacob.com.ComFailException: Can't map name to dispid: ExecQuery 
at com.jacob.com.Dispatch.invokev(Native Method) 
at com.jacob.com.Dispatch.invokev(Dispatch.java:858) 
at com.jacob.com.Dispatch.callN(Dispatch.java:455) 
at com.jacob.com.Dispatch.call(Dispatch.java:544) 
at com.jacob.activeX.ActiveXComponent.invoke(ActiveXComponent.java:510) 
at JacobWmiAdapter.getResultsList(JacobWmiAdapter.java:111) 
at JacobWmiAdapter.getResultsList(JacobWmiAdapter.java:104) 
at WindowsInfoCollector.getConnectionInfo(WindowsInfoCollector.java:516) 
at WindowsInfoCollector.collect(WindowsInfoCollector.java:118) 
at DiagnosisExecutor.execute(DiagnosisExecutor.java:128) 
at DiagnosisExecutor.run(DiagnosisExecutor.java:160) 
at java.lang.Thread.run(Thread.java:662) 

Нить запускается с помощью мыши с графическим интерфейсом, но ошибка воспроизводима вручную:

 DiagnosisExecutor dex = new DiagnosisExecutor(); 
     Thread thread1 = new Thread(dex); 
     Thread thread2 = new Thread(dex); 

     thread1.start(); 
     thread1.join(); 
     Thread.sleep(1000); 
     thread2.start(); 

Мне кажется, что некоторые выделенные ресурсы не освобождаются правильно, когда поток, который их использует, завершается. Любые намеки?

Обновление: JACOB Версия 1.14.3

+0

Мое решение: поскольку наивный подход к выпуску ресурсов с использованием ComThread.Release() не работает, я перешел от использования класса утилиты JACOB статическим способом к вызовам методов на своем экземпляре. Таким образом, основной объект ActiveXObject также получает внутреннюю реинстанцию. Вероятно, это вызывает некоторые утечки в кишках COM-слоя, но, будучи прагматичным парнем, мне действительно все равно. Эта операция будет называться 2, максимум 3 раза за сеанс, и я бы скорее закрыл эту проблему, как это, чем исследовать черную магию реализации интерфейса COM. –

ответ

1

Я не использовал последнюю версию JACOB с его новой потоковая модель, но более старые версии были определенно не поточно. Начиная с версии 1.7> они улучшили модель потоковой передачи, чтобы лучше отражать базовые COM-компоненты, но вам нужно определить, является ли указанный компонент MTA или STA, а затем соответствующим образом инициализировать классы JACOB. Обратитесь к JACOB documentation за тем, как правильно адаптировать приложение в соответствии с его требованиями.

+0

Спасибо за подсказку. Дело в том, что мне действительно не нужна безопасность потоков (есть только один поток, работающий с библиотекой за раз), но JACOB, похоже, не справляется с правильной работой. –

0

У меня возникла аналогичная проблема (первое выполнение нормально, второе не удалось создать совместно созданный объект), когда я начал устанавливать одно и то же имя потока для нескольких потоков. Добавление последовательного числа в качестве суффикса для имени потока исправило проблему для меня.

Смежные вопросы