2012-03-13 46 views
0

我有一個奇怪的問題,使用來自兩個相應啓動的相同線程的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

+0

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

回答

1

我沒有使用最新版本的雅各與它的新的線程模型,但舊版本是絕對線程安全的。從版本1.7開始,他們改進了線程模型以更好地反映底層的COM組件,但是您必須確定所述組件是否爲MTA或STA,然後適當地初始化JACOB類。請參閱JACOB documentation,瞭解如何根據其要求適當調整應用程序。

+0

感謝您的提示。事情是,我並不真的需要線程安全(一次只有一個線程與庫一起工作),但仍然JACOB似乎無法正確完成內務。 – 2012-03-13 14:11:52

0

我開始遇到類似的問題(第一次執行正常,第二次失敗,無法共同創建對象),當我開始將相同的線程名稱設置爲多個線程時。將序列號作爲後綴添加到線程名稱爲我解決了問題。