使用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(); } } 

我怎么能让它停止挂?

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

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

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

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

太可怕了,是的。

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