我有一個奇怪的問題,使用來自兩個相應啓動的相同線程的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)
線是用從一個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
我的解決方案:因爲使用ComThread.Release()釋放資源的幼稚方法無效,因此我從靜態方式使用JACOB實用程序類調用其實例上的方法。因此主要的ActiveXObject也在內部得到重新實例化。可能這會導致COM層的內部泄漏,但作爲一個實際的人,我真的不在乎。這個操作會被稱爲2次,每次會話最多3次,我寧願這樣來解決這個問題,而不是調查COM接口實現的黑魔法。 – 2012-03-13 16:51:46