gpt4 book ai didi

Java 打印线程卡住 : WHY?

转载 作者:行者123 更新时间:2023-12-03 12:48:00 26 4
gpt4 key购买 nike

在我的 Java 8 应用程序(RHEL 6.x、Wildfly 10.1.0.Final)中,当用户第一次打印文档时,应用程序在从系统获取打印机列表时卡住了。

这是阻塞线程的堆栈跟踪:

"Thread-211" #799 daemon prio=5 os_prio=0 tid=0x00007fca543a6800 nid=0x10755 runnable [0x00007fca02820000]

java.lang.Thread.State: RUNNABLE
at sun.print.CUPSPrinter.canConnect(Native Method)
at sun.print.CUPSPrinter.isCupsRunning(CUPSPrinter.java:444)
at sun.print.UnixPrintServiceLookup.getDefaultPrintService(UnixPrintServiceLookup.java:650)
- locked <0x00000006d2c7fff8> (a sun.print.UnixPrintServiceLookup)
at sun.print.UnixPrintServiceLookup.refreshServices(UnixPrintServiceLookup.java:277)
- locked <0x00000006d2c7fff8> (a sun.print.UnixPrintServiceLookup)
at sun.print.UnixPrintServiceLookup$PrinterChangeListener.run(UnixPrintServiceLookup.java:947)

尝试打印文档的其他用户和亲戚线程被此线程阻止。

我查看了 CUPSPrinter.canConnect() 的源代码( native 代码),此时我们尝试连接到 cups 服务器:

/*
* Checks if connection can be made to the server.
*
*/
JNIEXPORT jboolean JNICALL
Java_sun_print_CUPSPrinter_canConnect(JNIEnv *env,
jobject printObj,
jstring server,
jint port)
{
const char *serverName;
serverName = (*env)->GetStringUTFChars(env, server, NULL);
if (serverName != NULL) {
http_t *http = j2d_httpConnect(serverName, (int)port);
(*env)->ReleaseStringUTFChars(env, server, serverName);
if (http != NULL) {
j2d_httpClose(http);
return JNI_TRUE;
}
}
return JNI_FALSE;
}

在我的例子中,CUPS 在同一台主机上监听端口 631。我检查了日志,一切似乎都很好。

我还使用 netstat 检查了 cups 的 Activity 连接:

tcp        0      0 0.0.0.0:631                 0.0.0.0:*                   LISTEN      76107/cupsd         
tcp 0 0 127.0.0.1:45652 127.0.0.1:631 TIME_WAIT -
tcp 0 0 :::631 :::* LISTEN 76107/cupsd
tcp 0 0 ::1:35982 ::1:631 TIME_WAIT -
tcp 0 0 ::1:35981 ::1:631 TIME_WAIT -
tcp 0 0 ::1:35978 ::1:631 TIME_WAIT -
tcp 0 0 ::1:35979 ::1:631 TIME_WAIT -
udp 0 0 0.0.0.0:631 0.0.0.0:* 76107/cupsd

重要说明:

  • 如果我重新启动 Cups 服务,线程不会解除阻塞。它似乎永远存在,直到应用程序重新启动。
  • 我在 Open JDK 上发现了一个与此类似的错误:https://bugs.openjdk.java.net/browse/JDK-6290446 但是设置 -Dsun.java2d.print.polling=false 的变通方法对我不起作用(该属性似乎在由于一些不明确的原因,所以 PrinterChangeListener 被实例化,尽管轮询未被停用)。
  • 我无法在同一台服务器上使用测试应用程序(生产克隆)重现该问题

请帮助!!

最佳答案

-Djava.awt.printerjob=sun.print.PSPrinterJob

关于Java 打印线程卡住 : WHY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62996781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com