Библиотека Jacob не удается при использовании в нескольких потоках
-
13-12-2019 - |
Вопрос
У меня странная проблема, используя Джейкоб из двух, следовательно, начал одинаковые потоки.У меня есть утилитный класс, который использует поле Static ActiveXObject для диспетчеризации различных запросов к WMI.Первый нить работает нормально.Когда второй поток запущен, я получаю следующее исключение:
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
Решение
Я не использовал последнюю версию JACOB с новой моделью Threading, но более старые версии были определенно не безопасным потоком.Нашей версии 1.7> они улучшили модель резьбы, чтобы лучше отразить базовые компоненты COM, но вы должны определить, является ли указанный компонент MTA или STA, а затем инициализируйте классы Jacob.Обратитесь к Документация Jacob для того, чтобы правильно адаптировать ваше приложение в соответствии с его требованиями.
Другие советы
Я начал испытывать подобную проблему (первое выполнение OK, второе не удалось с помощью объекта CORMET CREATE), когда я начал устанавливать одно и то же имя потока на несколько потоков.Добавление последовательного числа в качестве суффикса к названию резьбы исправлена проблема для меня.