使用JMS发送消息在退出时挂起

时间:2011-11-26 20:55:32

标签: java glassfish jms

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

问题是,在应用程序发送消息后,它会在应该退出时挂起。消息传输成功,但由于某种原因,应用程序不会退出。我试图调试应用程序,我可以一直走到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();
}

}

如何让它停止悬挂?

2 个答案:

答案 0 :(得分:3)

很长一段时间,这是Glassfish的一个错误。

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

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

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

太可怕了,是的。

答案 1 :(得分:0)

对线程转储的良好调用。尝试发布Conn.stop()。似乎JMS客户端仍然运行非守护程序线程