Tôi đang làm việc trên một ứng dụng nhỏ nên ký các tài liệu bằng chữ ký số và thoát. Chữ ký có thể nằm trong kho lưu trữ PKCS # 12 (tệp .pfx) hoặc trên thiết bị thẻ thông minh.JVM treo trên lối ra
Làm việc với tệp pfx dễ dàng và hoạt động tốt.
Tuy nhiên, đôi khi sử dụng thiết bị thẻ thông minh, quy trình bị treo trên máy tính Windows 8.
Tài liệu được ký chính xác nhưng quá trình này không chấm dứt. Nó chỉ bị treo.
Tôi đang sử dụng PKCS # 11 nhà cung cấp của Mặt Trời - sun.security.pkcs11.SunPKCS11
Về cơ bản tôi đang làm điều này:
SunPKCS11 provider = new SunPKCS11(configuration);
Security.addProvider(provider);
..... some work .....
provider.logout()
Security.removeProvider(provider);
Bây giờ ... thậm chí nếu tôi gọi System.exit(0)
hoặc ném một ngoại lệ ở cuối của phương thức main
, tôi có thể thấy stacktrace trong đầu ra nhưng quá trình này không chấm dứt.
Tôi đã thêm móc tắt để xem nó có được thực hiện hay không, tức là JVM đang cố gắng dừng.
Rất hiếm khi xảy ra sự cố treo trên máy tính chạy Windows 8. Đã thử với các thẻ thông minh khác nhau và nó chỉ xảy ra với các thẻ sử dụng cmp11.dll
(các dll được cung cấp từ các nhà cung cấp thẻ thông minh).
Sử dụng cùng một dll để giao tiếp với các thẻ thông minh, tuy nhiên, hoạt động tốt trên Windows 7, XP hoặc một số Windows 8 máy tính
Chạy nó với Java 8, Cập nhật 45 tuổi, ở hai x86 hoặc x64 Windows 8
Cố gắng để có được một bãi chứa thread để xem những gì đang treo:
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...");
}
Nếu tôi thực hiện jstack -l 3232 > dump.log 2>&1
khi Sleep... x
là in ấn, tất cả mọi thứ có vẻ OK.
Tuy nhiên, nếu tôi thực hiện jstack -F -l 3232 > dump2.log 2>&1
khi Exiting...
được in và treo ứng dụng (sử dụng -F
bởi vì quá trình bị treo), tôi đã nhận như sau:
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
tôi có thể thấy quá trình với PID 3232 trong nhiệm vụ giám đốc!
Bất kỳ ý tưởng nào tại sao nó không chấm dứt hoặc tại sao jstack
không thành công?
EDIT
Ok, đã cố gắng để trích xuất các ký trong một quá trình riêng biệt, thực hiện nó với Runtime.exec
và sau đó giết nó với Process.destroy
nhưng ... dường như không giúp đỡ. Quá trình con vẫn còn trong trình quản lý tác vụ.
Aaaaand ...bây giờ tôi không có lựa chọn nào khác ngoài việc làm cho nó giết chính nó;. (
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
Cố gắng với Runtime.halt
cũng Vẫn không chấm dứt quá trình ...
Tôi sẽ đánh giá cao bất kỳ ý tưởng nào!
Bạn đã thử kiểm tra các chuỗi gốc bằng cách sử dụng [Process Explorer] (https://technet.microsoft.com/cs-cz/sysinternals/processexplorer)? Hoặc bạn có thể tạo ra một bãi chứa và cố gắng phân tích nó ... Chúc may mắn! – vlp
Đã qua [this] (http://stackoverflow.com/a/34012012/5128464) .... – vlp