Eu estou tentando criar um projeto de cliente de aplicativo Java que envia uma mensagem JMS para uma fila em um servidor Glassfish.
O problema é que, depois que o aplicativo envia a mensagem, ela trava quando deveria sair. A mensagem é transmitida com sucesso, mas por algum motivo o aplicativo não sai. Eu tentei depurar o aplicativo, e posso percorrer todo o caminho até o fim do static void main
, e é aí que ele trava.
Aqui está o código:
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(); } }
Como posso parar de pendurar?
Tem sido um bug no Glassfish há muito tempo.
Há um bug registrado aqui (reportado na versão 9 do Sun App Server, anterior ao Glassfish), mas suspeito que haverá muitos relatórios duplicados:
http://java.net/jira/browse/GLASSFISH-1429
Minha única correção conhecida é System.exit (0) (em um bloco finally), que fecha todos os threads.
Horrível, sim.
Boa chamada no despejo de discussão. Tente emitir um Conn.stop (). Parece que o cliente JMS ainda possui threads não daemon em execução