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