【问题标题】:Sending message with JMS hangs on exit使用 JMS 发送消息在退出时挂起
【发布时间】:2012-01-07 01:37:47
【问题描述】:

我正在尝试创建一个将 JMS 消息发送到 Glassfish 服务器上的队列的 Java 应用程序客户端项目。

问题是应用程序发送消息后,它应该退出时挂起。消息传输成功,但由于某种原因应用程序没有退出。我已经尝试调试应用程序,我可以一直执行到static void main 的末尾,这就是它挂起的地方。

代码如下:

import javax.jms.*;
import javax.naming.InitialContext;


public class Main {

public void SendMessage() throws Exception {
    InitialContext ctx = new InitialContext();
    ConnectionFactory cf = (ConnectionFactory) ctx.lookup("jms/TestFactory");
    Queue queue = (Queue)ctx.lookup("jms/TestQueue");
    Connection conn = cf.createConnection();
    Session s = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
    MessageProducer prod = s.createProducer(queue);

    TextMessage txt = s.createTextMessage("testing");
    prod.send(txt);

    prod.close();
    s.close();
    conn.close();
}

public static void main(String[] args) throws Exception {
    Main m = new Main();
    m.SendMessage();
}

public Main() {
    super();
}

}

我怎样才能让它停止挂起?

【问题讨论】:

  • 在应用程序挂起时进行线程转储将非常有用。
  • 以下是我的应用程序挂起时正在运行的线程:pastebin.com/wQRsqbys

标签: java glassfish jms


【解决方案1】:

很好地调用线程转储。尝试发出 Conn.stop()。看来 JMS 客户端仍然有非守护线程在运行

【讨论】:

  • 我应该在哪里写?如果我在conn.close() 之前写conn.stop(),应用程序仍然会挂起,如果我在conn.close 之后写conn.stop(),我会得到一个Exception in thread "main" com.sun.messaging.jms.IllegalStateException: MQRA:CA:Illegal:Connection is closed
【解决方案2】:

Glassfish 中的一个 bug 已经存在很长时间了。

这里记录了一个错误(在 Sun App Server 的第 9 版中报告,早于 Glassfish),但我怀疑会有很多重复报告:

http://java.net/jira/browse/GLASSFISH-1429

我唯一已知的修复方法是 System.exit(0)(在 finally 块中),它会关闭所有线程。

可怕,是的。

【讨论】:

  • 这也是我找到的唯一解决方案。我希望它很快得到修复。
  • 该错误现在在 glassfish 4.0 beta 中被标记为已修复。它显然永远不会在被确认存在的 2.1 或 3.x 中修复。
猜你喜欢
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多