【问题标题】:Java printing thread gets stuck : WHY?Java 打印线程卡住了:为什么?
【发布时间】:2020-11-09 18:53:11
【问题描述】:

在我的 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()的源代码(本机代码),此时我们尝试连接到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 检查了杯子的活动连接:

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 得到实例化,尽管轮询未停用)。
  • 我无法在同一台服务器上使用测试应用程序(生产克隆)重现该问题

请帮忙!!

【问题讨论】:

    标签: java multithreading printing rhel cups


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多