Сбой библиотеки JACOB при использовании в нескольких потоках - PullRequest
0 голосов
/ 13 марта 2012

У меня странная проблема с использованием JACOB из двух последовательно запущенных идентичных потоков. У меня есть служебный класс, который использует статическое поле 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

Ответы [ 2 ]

1 голос
/ 13 марта 2012

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

0 голосов
/ 05 апреля 2013

Я начал сталкиваться с подобной проблемой (первое выполнение в порядке, второе не удалось с Can't co-create object), когда я начал устанавливать одно и то же имя потока для нескольких потоков. Добавление порядкового номера в качестве суффикса к имени потока исправило проблему для меня.

...