Pergunta

Eu tenho um problema estranho ao usar JACOB de dois threads idênticos iniciados consequentemente.Eu tenho uma classe de utilitário que usa um campo ActiveXObject estático para despachar várias solicitações ao WMI.O primeiro tópico funciona bem.Quando o segundo thread é iniciado, recebo a seguinte exceção:

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)

O thread é iniciado com um clique do mouse em uma GUI, mas o erro pode ser reproduzido manualmente:

        DiagnosisExecutor dex = new DiagnosisExecutor();
        Thread thread1 = new Thread(dex);
        Thread thread2 = new Thread(dex);

        thread1.start();
        thread1.join();
        Thread.sleep(1000);
        thread2.start();

Parece-me que alguns recursos alocados não estão sendo liberados corretamente quando a thread que os utiliza termina.Alguma dica?

Atualizar:JACOB versão 1.14.3

Foi útil?

Solução

Eu não usei a versão mais recente do JACOB com seu novo modelo de threading, mas as versões mais antigas foram definitivamente não discussão segura.A partir da versão 1.7 > eles melhoraram o modelo de threading para refletir melhor os componentes COM subjacentes, mas você deve determinar se esse componente é MTA ou STA e, em seguida, inicializar as classes JACOB adequadamente.Consulte o Documentação JACOB para saber como adaptar adequadamente sua aplicação de acordo com seus requisitos.

Outras dicas

Comecei a ter um problema semelhante (primeira execução ok, segunda falha com Não é possível co-criar objeto), quando comecei a definir o mesmo nome de thread para vários threads.Adicionar um número sequencial como sufixo ao nome do thread resolveu o problema para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top