2015-06-18 24 views
7

Pracuję nad małą aplikacją, która powinna podpisywać dokumenty za pomocą podpisu cyfrowego i zakończyć działanie. Podpis może znajdować się w archiwum PKCS # 12 (plik .pfx) lub na karcie inteligentnej.JVM zawiesza się przy wyjściu

Praca z plikiem pfx jest łatwa i działa dobrze.

Jednak czasami przy użyciu karty inteligentnej proces się zawiesza na komputerach z systemem Windows 8.

Dokument jest podpisany poprawnie, ale proces się nie kończy. Po prostu wisi.

Używam PKCS # 11 dostawcę słoneczną - sun.security.pkcs11.SunPKCS11

zasadzie robię to:

SunPKCS11 provider = new SunPKCS11(configuration); 
Security.addProvider(provider); 

..... some work ..... 

provider.logout() 
Security.removeProvider(provider); 

... Teraz nawet jeśli zadzwonię System.exit(0) lub wyjątek na koniec metody main, widzę stacktrace na wyjściu, ale proces nie kończy się.

Dodałem hak do zamykania, aby zobaczyć, czy jest on wykonywany i to jest, tj. JVM próbuje zatrzymać.

Zawieszenie występuje rzadko, tylko na komputerach z systemem Windows 8. Próbowano z różnymi kartami inteligentnymi i dzieje się tak tylko z kartami, które używają cmp11.dll (biblioteki dll są dostarczane przez sprzedawców kart inteligentnych).

Używając tego samego dll za komunikację z karty inteligentnej, jednak działa poprawnie na Windows 7, XP lub niektórych Windows 8 komputerów

Running go z Java 8, Update 45, po obu x86 lub x64 systemu Windows 8

Próbowano uzyskać zrzut wątek, aby zobaczyć, co wisi:

public static void main(String[] args) { 
    // do my job, register provider, sign documents, remove provider ... 

    for(int i = 0; i < 20; ++i) { 
    System.err.println("Sleep... " + i); 
    Thread.sleep(2 * 1000); 
    } 
    System.err.println("Exiting..."); 
} 

Gdybym wykonać jstack -l 3232 > dump.log 2>&1 gdy Sleep... x drukowania, wszystko wygląda OK.

Jednak gdybym wykonać jstack -F -l 3232 > dump2.log 2>&1 gdy Exiting... jest drukowany i zawiesza aplikacji (za pomocą -F ponieważ proces zawiesza się), mam następujący:

Attaching to process ID 3232, please wait... 
Debugger attached successfully. 
Server compiler detected. 
JVM version is 25.45-b02 
Deadlock Detection: 

No deadlocks found. 

Thread Exception in thread "main"   
java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:497) 
     at sun.tools.jstack.JStack.runJStackTool(JStack.java:140) 
     at sun.tools.jstack.JStack.main(JStack.java:106) 
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Windbg Error: GetThreadIdBySystemId failed! 
     at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.getThreadIdFromSysId0(Native Method) 
     at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.getThreadIdFromSysId(WindbgDebuggerLocal.java:284) 
     at sun.jvm.hotspot.debugger.windbg.amd64.WindbgAMD64Thread.getThreadID(WindbgAMD64Thread.java:88) 
     at sun.jvm.hotspot.debugger.windbg.amd64.WindbgAMD64Thread.toString(WindbgAMD64Thread.java:81) 
     at java.lang.String.valueOf(String.java:2982) 
     at java.io.PrintStream.print(PrintStream.java:683) 
     at sun.jvm.hotspot.runtime.win32_amd64.Win32AMD64JavaThreadPDAccess.printThreadIDOn(Win32AMD64JavaThreadPDAccess.java:114) 
     at sun.jvm.hotspot.runtime.JavaThread.printThreadIDOn(JavaThread.java:265) 
     at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:79) 
     at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:45) 
     at sun.jvm.hotspot.tools.JStack.run(JStack.java:66) 
     at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260) 
     at sun.jvm.hotspot.tools.Tool.start(Tool.java:223) 
     at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118) 
     at sun.jvm.hotspot.tools.JStack.main(JStack.java:92) 
     ... 6 more 

widzę proces z PID 3232 w zadaniu menedżer!

Każdy pomysł, dlaczego nie kończy się lub dlaczego jstack kończy się niepowodzeniem?

EDIT


Ok, starał się wydobyć podpisanie w oddzielnym procesie, wykonać go z Runtime.exec a następnie zabić go Process.destroy ... ale nie wydaje się, aby pomóc. Proces potomny nadal pozostaje w menedżerze zadań.

Aaa ...teraz nie mam innego wyboru, aby zabić sobie;. (

try { 
    String name = java.lang.management.ManagementFactory.getRuntimeMXBean().getName(); 
    Runtime.getRuntime().exec("taskkill.exe /F /PID " + name.split("@")[0]); 
} 
catch(Throwable t) { 
    Runtime.getRuntime().exec("taskkill.exe /F /IM java.exe"); 
} 

EDIT 2


Próbowałem z Runtime.halt oraz Wciąż nie zakończyć proces ...

Byłbym wdzięczny za wszelkie pomysły!

+0

Czy próbowałeś sprawdzić natywne wątki za pomocą [Process Explorer] (https://technet.microsoft.com/cs-cz/sysinternals/processexplorer)? Możesz też wygenerować zrzut i spróbować go przeanalizować ... Powodzenia! – vlp

+0

Przyszedł przez to (http://stackoverflow.com/a/34012012/5128464) .... – vlp

Odpowiedz

0

mam jakiś problem z sun.security.pkcs11.SunPKCS11 na Windows 8 PCs.This pracuje dla mnie:

Runtime.getRuntime().exec("taskkill.exe /F /PID " + name.split("@")[0]); 
Thread.sleep(500); 
Powiązane problemy