在多个线程中使用时,JACOB库失败

时间:2012-03-13 13:04:58

标签: java multithreading activex wmi jacob

我有一个奇怪的问题,使用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)

通过鼠标单击GUI启动线程,但错误可手动重现:

        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 个答案:

答案 0 :(得分:1)

我没有使用最新版本的JACOB及其新的线程模型,但旧版本肯定 线程安全。从版本1.7开始>他们改进了线程模型以更好地反映底层COM组件,但您必须确定所述组件是MTA还是STA,然后适当地初始化JACOB类。请参阅JACOB documentation了解如何根据需要正确调整应用程序。

答案 1 :(得分:0)

当我开始将相同的线程名称设置为多个线程时,我开始遇到类似的问题(第一次执行ok,第二次失败,无法共同创建对象)。添加序号作为线程名称的后缀为我解决了问题。