La bibliothèque Jacob échoue lorsqu'elle est utilisée dans plusieurs threads
-
13-12-2019 - |
Question
J'ai un problème étrange à l'aide de Jacob à partir de deux au départ des threads identiques.J'ai une classe d'utilité qui utilise un champ Static ActiveXObject pour avoir envoié diverses demandes au WMI.Le premier fil fonctionne bien.Lorsque le deuxième fil est démarré, je reçois l'exception suivante:
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)
Le fil est démarré par un clic de souris depuis une interface graphique, mais l'erreur est reproductible manuellement:
DiagnosisExecutor dex = new DiagnosisExecutor();
Thread thread1 = new Thread(dex);
Thread thread2 = new Thread(dex);
thread1.start();
thread1.join();
Thread.sleep(1000);
thread2.start();
Il me semble que certaines ressources allouées ne sont pas libérées correctement lorsque le fil qui les utilise se termine.Toute astuce?
mise à jour: JACOB version 1.14.3
La solution
Je n'ai pas utilisé la dernière version de Jacob avec son nouveau modèle de threading, mais les versions plus anciennes étaient définitivement
Autres conseils
J'ai commencé à avoir un problème similaire (première exécution OK, deuxième échec avec Impossible de co-créer un objet), lorsque j'ai commencé à définir le même nom de thread sur plusieurs threads.Ajout d'un numéro séquentiel sous forme de suffixe au nom du thread résolu le problème pour moi.