Chat JMS com ActiveMQ

Este post foi removido e transferido para a seguinte url:

http://www.mballem.com/post/chat-jms-com-activemq

, , , ,

  1. #1 por bruno em 13/03/2011 - 17:46

    Legal o post bem informativo.

  2. #2 por Rafael em 04/06/2011 - 15:23

    da erro depois que eu escrevo meu nome no console

  3. #3 por MBallem em 04/06/2011 - 19:07

    Que erro?
    Se fez tudo certinho conforme o tutorial, não dará erro nenhum.

  4. #4 por Rafael em 06/06/2011 - 11:11

    Digite seu nome: rafael
    javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.activemq.jndi.ActiveMQInitialContextFactory [Root exception is java.lang.ClassNotFoundException: org.apache.activemq.jndi.ActiveMQInitialContextFactory ]
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.init(InitialContext.java:223)
    at javax.naming.InitialContext.(InitialContext.java:175)
    at Chat.(Chat.java:25)
    at Chat.main(Chat.java:102)
    Caused by: java.lang.ClassNotFoundException: org.apache.activemq.jndi.ActiveMQInitialContextFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:46)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
    … 5 more

  5. #5 por Rafael em 06/06/2011 - 11:12

    bem.. pelo que entendi.. ele nao ta achado o arquivo properties?? fiz igual o tutorial, criei o arquivo e coloquei junto no src
    ?!?

  6. #6 por MBallem em 06/06/2011 - 11:40

    O problema é esse: java.lang.ClassNotFoundException: org.apache.activemq.jndi.ActiveMQInitialContextFactory
    Ele não está encontrando essa classe: ActiveMQInitialContextFactory que fica dentro do arquivo activemq-all-5.4.2.jar.

    Você adicionou esse arquivo no projeto?

    Da uma olhada na linha 102 e 25 da classe Chat, o que você tem nelas?

  7. #7 por Rafael em 06/06/2011 - 13:16

    adicionei sim…

    25 – InitialContext ctx = new InitialContext();
    102 Chat chat = new Chat(“TopicCF”, “topicChat”, name);

    ta extamente igual ao seu exemplo… só dei um ctrl+C

  8. #8 por Rafael em 06/06/2011 - 13:42

    refiz denovo…..
    no eclipse criei um projeto normal…. criei o package e a classe, colei o codigo, depois criei no bloco de notas o arquivo properties e salvei dentro do scr, adicionei o .jar, startei o serviço, criei o topic la na pagina do AqtiveMQ.. rodei a classe e esta dando seguinte erro agora:

    Digite seu nome: rafael
    javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at br.mb.tutorialActiveMQ.chat.Chat.(Chat.java:31)
    at br.mb.tutorialActiveMQ.chat.Chat.main(Chat.java:104)

  9. #9 por MBallem em 06/06/2011 - 15:10

    Agora sim está parecendo que o arquivo não está sendo encontrado.
    As vezes quando você cria arquivo pelo bloco de notas o S.O omite a extensão .txt, então acaba salvando como jndi.properties.txt e o seu sistema não encontra o arquivo que procura.

    Então, teste assim, exclua o arquivo que você adicionou e crie um arquivo direto pelo eclipse. Vá na opção new -> file e crie o arquivo e adicione as propriedades. Depois me responda se deu certo ou não.

  10. #10 por Rafael em 06/06/2011 - 15:35

    fiz isso… nao deu em nada ;/

  11. #11 por Rafael em 06/06/2011 - 15:35

    ta dando o mesmo erro

  12. #12 por Rafael em 06/06/2011 - 15:52

    fiz no netbeans… segui os mesmos passos, criei o properties la dentro mesmo.. e da o mesmo erro

  13. #13 por MBallem em 06/06/2011 - 15:57

    Estranho. Meu projeto inicial foi feito no IDEA então eu refiz aqui no Eclipse para testar e deu certo.
    Não sei o que pode estar ocorrendo. Vou te mandar por email o projeto que fiz no Eclipse, dai você testa ai.

  14. #14 por Rafael em 06/06/2011 - 16:30

    okk…aguardo

  15. #15 por Rafael em 07/06/2011 - 10:23

    seu proj. funcionou legal aqui, nao sei qual foi o misterio… copiei pra o meu projeto e nao funcionou… removi e add o jar.. mudei o nome do package, mudei nome da classe… e funcionou, –‘ rsrrs seila o q q deu.. mas valew, seu projeto vai me ajudar em muito na facul
    seu blog está de parabéns, sempre consutarei…
    obrigado pela atenção
    forte abraço
    Att.

  16. #16 por MBallem em 07/06/2011 - 10:55

    Legal que pude ajudar Rafael.
    T+

  17. #17 por thiagods em 16/08/2011 - 21:24

    E ai ballem.. cara to escrevendo to celular.. eu vi seu email vou dar uma estudada nisso.. o chat vai ser parecido com o do facebook/gmail eh o chat interno da empresa.. uso isso msm??? Abraco obrigado pela resposta.

  18. #18 por MBallem em 16/08/2011 - 21:30

    thiagods, acho mais vantajoso e dependendo o servido web que você usa na empresa, pode implementar o chat para esse servidor (Jboss, Glassfish, Jonas…) ao invés de usar o ActiveMQ.

  19. #19 por Thiago Diniz em 17/08/2011 - 2:57

    Estou usando o servidor tomcat 7.0 apesar de saber que não é muito bom, é provisório, depois talvez eu mude.. não terá muitas conexões então o tomcat suportará de boa acho.

    É vou dar uma estudada certinho sobre o JMS… poxá é foda escrever do celular porque não tem como colocar acentuação e tals e incrivelmente não escrevi quase nada errado hehe.. por isso tinha comentado aquilo no post #17.

    Obrigado.

  20. #20 por Thiago Diniz em 17/08/2011 - 18:00

    MBallem consegui fazer um chatzinho usando seu post, com ActiveMQ, agora vou tentar unir o ActiveMQ com o Tomcat para quando 1 ser executado o outro ser executado junto e Maven também pois uso maven para gerenciar as dependencias, mudar o chat para as mensagens ir só para o usuário específico (acho que não poderei usar o estilo de Topic, terei que usar o estilo P2P correto?) não me aprofundei no seu código ainda pois já acabou meu tempo de serviço hehe =P amanhã darei uma olhada melhor e verei o que fazer.. dificil achar esse assunto na internet, mesmo em site inglês é complicado, claro que tem bastante coisa, mas não tanto como outros assuntos tipo sockets e threads.

  21. #21 por MBallem em 17/08/2011 - 18:38

    Thiago Diniz, o JMS funciona de 2 maneiras, com tópicos ou com filas.
    No caso de Tópico vários usuários podem receber a mesma mensagem, que é o fundamento de um Chat. Já no caso de Filas, uma mensagem pode ser consumida por apenas um usuário, por que depois de consumida é sai da fila e ninguém mais pode consumi-la.

    Você precisa ver bem como vai ser seu sistema, se vários usuários podem conversar juntos ao mesmo tempo entre eles ou se o papo vai de apenas entre 2 usuários. Ou se trabalhar com filas e quiser enviar a mesma mensagem para mais de uma pessoa, você vai precisar enviar separadamente a mesma mensagem para cada uma das pessoas, também é uma alternativa.

    Material de JMS especificamente sobre chat não é fácil de achar mesmo, mas você encontra muito material falando sobre uso de JMS o que vai ser muito útil para você.

  22. #22 por thiagods em 17/08/2011 - 21:05

    No comeco um usuario soh podera falar com outro usuario diretamente.. sem o chat em grupo.. isso eh para se pensar no futuro hehe.. a principio vou usar por filas msm mas gostei de usar o do topico tbm.. qnd eu termina ti passo o com filas se quiser publicar no blog e ter 2 versoes.. obviamente poderas modificar como quiser. Obrigado.. Thiago

  23. #23 por MBallem em 17/08/2011 - 22:11

    Ok Thiago, se quiser pode mandar sim.
    T+.

  24. #24 por Thiago Diniz em 18/08/2011 - 14:18

    Claro.. Té mais.

  25. #25 por Ricardo em 20/09/2011 - 10:25

    Olá Marcio, estou tendo o mesmo problema que o Rafael teve com relação ao arquivo de properties ja tentei fazer td o que vcs comentaram acima mas não obtive sucesso. depurei o codigo e ele da o erro extamente nessa linha:
    TopicConnectionFactory conFactory = (TopicConnectionFactory) ctx.lookup(topicFactory);
    O meu arquivo jndi.properties está junto no mesmo pacote onde esta a classe Chat, mas está dando o mesmo erro que aconteceu com o Rafael.. Estou usando o NetBeans 7.0.1

  26. #26 por MBallem em 20/09/2011 - 15:33

    Oi Ricardo.
    A estrutura do seu projeto está conforme a da imagem abaixo?
    Projeto ActiveMQ

  27. #27 por Ricardo em 20/09/2011 - 16:34

    Não, o jndi estava dentro da pasta chat no caso mas eu coloquei no pacote padrão ou seja dentro do src e então qdo depurei ele passou a dar erro na linha:

    // Utiliza o TopicConnectionFactory para criar a conexão com o provedor JMS
    TopicConnection connection = conFactory.createTopicConnection();

    o seguinte erro:

    Digite seu nome: ricardo
    javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect
    at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:35)
    at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:286)
    at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:230)
    at org.apache.activemq.ActiveMQConnectionFactory.createTopicConnection(ActiveMQConnectionFactory.java:208)
    at chat.Chat.(Chat.java:44)
    at chat.Chat.main(Chat.java:107)
    Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:525)
    at org.apache.activemq.transport.tcp.TcpTransport.connect(TcpTransport.java:484)
    at org.apache.activemq.transport.tcp.TcpTransport.doStart(TcpTransport.java:447)
    at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:53)
    at org.apache.activemq.transport.InactivityMonitor.start(InactivityMonitor.java:127)
    at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58)
    at org.apache.activemq.transport.WireFormatNegotiator.start(WireFormatNegotiator.java:72)
    at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58)
    at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58)
    at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:266)
    … 4 more
    CONSTRUÍDO COM SUCESSO (tempo total: 44 segundos)

    é normal o topico que cria no item 5 do post o topicChat que cria no ActiveMQ sumir pq eu entrei la pra ver se tava td certo e ele não tava la, dai eu criei de novo mas sempre que fecho o navegador ele some.

  28. #28 por MBallem em 20/09/2011 - 18:09

    Acontece se você “desligar” o ActiveMQ. Mas enquanto está usando e tiver registrado o tópico, ele não deve desaparecer.
    Da uma olhada no console quando inicia o ActiveMQ se você tem acesso a essa porta (61616): INFO | Listening for connections at: tcp://localhost:61616 Pode aparecer o nome do seu PC ao invés de localhost.

    Essa exceção faz parecer que o ActiveMQ não está rodando no momento que você inicia o chat.

  29. #29 por Ricardo em 21/09/2011 - 9:25

    Ok agora funcionou..
    eu verifiquei se estava tendo acesso a porta 61616 e estava normal, porém com o nome do meu PC no lugar de localhost, dai eu mudei tbm no jndi.properties e funcionou!!

    Agora queria fazer o chat por meio de uma interface e não no console, devo substituir as entradas do console pelas entradas da interface certo! E pra cada usuario novo que se conectar eu instancio novamente a classe chat é mais ou menos isso?? Vou tentar fazer.. caso surja alguma dúvida eu posto aqui.

    Seu blog ta me ajudando bastante… valeu!!

  30. #30 por Ricardo em 21/09/2011 - 9:48

    Como “desliga” o ActiveMQ pq o chat só funciona qdo eu executo o activemq.bat e deixo o console aberto, se fecho o console ele para de funcionar, é isso mesmo ele só funciona assim ou é mais alguma coisa que fiz de errado?

  31. #31 por MBallem em 21/09/2011 - 15:32

    Se você fechar o console automaticamente mata o serviço do ActiveMQ.

  32. #32 por Ricardo em 21/09/2011 - 17:49

    Então toda vez que for rodar o programa terá que ativar o serviço de deixar o console aberto? Isso é ruim né, pq se por acaso fechar o programa para de funcionar!!

    To com outro problema, como eu disse to tentando fazer o chat por meio de uma interface usando jsp e servlet e ao invéz de instanciar o construtor da classe chat no main eu instaciei na servlet e retirei o main da classe chat.

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType(“text/html;charset=UTF-8”);
    PrintWriter out = response.getWriter();
    try {
    HttpSession session = request.getSession();
    LoginBean bean = new LoginBean();
    bean = (LoginBean) session.getAttribute(“usuario”);

    try {
    // Faz uma chamada ao construtor da classe para iniciar o chat
    Chat chat = new Chat(“TopicCF”,”topicChat”, bean.getLogin());
    chat.armazena(bean.getLogin());

    session.setAttribute(“usrConectados”, Chat.Nomes);
    getServletContext().getRequestDispatcher(“/chattodo.jsp”).forward(request, response);

    } catch (Exception ex) {
    request.setAttribute(“msg”, ex.getMessage());
    getServletContext().getRequestDispatcher(“/Mensagem.jsp”).forward(request, response);
    }

    } finally {
    out.close();
    }
    }

    Mas na execução da um erro: Name topicCF is not bound in this Context
    dizendo que o topicCF não é obrigatório nesse contexto.
    como eu nunca tinha usado JMS antes não sei se isso funciona assim mas dei uma pesquisada e encontrei mais gente tendo o mesmo problema na mesma situação, porém ninguem deu uma solução.
    Queria saber se vc conhece esse problema? Se isso que estou fazendo não funciona assim? Ou se tem alguma outra forma de fazê-lo.

  33. #33 por MBallem em 21/09/2011 - 18:13

    Sobre a 1ª pergunta: O chat só funciona se o ActiveMQ estiver rodando. Você não precisa ficar parando e iniciando o serviço toda vez que iniciar ou parar o chat, deixa o ActiveMQ sempre rodando. Funciona como um servidor tipo TomCat, precisa estar rodando para acessar a aplicação.

    Sobre a 2ª, eu nunca implementei esse chat com Servlet, então nunca tive esse problema. Já implementei com Swing e também não lembro de ter tido esse erro. Mas com certeza o JMS funciona com Servlet.
    Não sei o que poderia estar causando isso. Talvez, ele não esteja encontrando as configurações do arquivo .jndi.

  34. #34 por Fernanda em 24/02/2012 - 16:29

    Olá Marcio,
    estou tentando fazer o exemplo do livro O’REILLY, Java Message Service, mas estou com dificuldade na hora de configurar o JNDI. Estou usando o JDeveloper, criei duas libs, uma para o ActiveMQ e outra para o JNDI (baixei o RMI). Aparece o erro:

    Topic or username missing
    javax.naming.NameNotFoundException: TopicConnectionFactory
    at org.apache.activemq.jndi.ReadOnlyContext.lookup(ReadOnlyContext.java:235)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at testejmschat.Chat.(Chat.java:31)
    at testejmschat.Chat.main(Chat.java:89)

    Não sei o que falta configurar! Criei um arquivo jndi.properties e joguei dentro do pacote em que esta a minha classe.
    No livro não mostra a parte do JNDI, eu queria ver um projeto de exemplo, funcionando, para ir configurando o que eu estou fazendo! Você poderia me enviar este do tutorial?

    Obrigada!

  35. #35 por MBallem em 24/02/2012 - 17:15

    Enviei para você Fernanda. Espero que te ajude.

  36. #36 por marshallpaiva em 30/04/2012 - 9:22

    Aqui tbm tava dando os mesmos erros e resolvi adicionando essa biblioteca no projeto slf4j-simple-1.5.8.jar. O site onde vcs podem baixar http://www.slf4j.org/download.html

    vlw Galera!

  37. #37 por elissandro em 24/11/2012 - 23:49

    cara tentei aqui e n ta funcionando….tentei de todas formas e nd….s pudesses m enviar o projecto
    feito, eu agradeceria pq tenho que atraves dele fazer com q passe um arquivo e n so um simples chat….meu email é elissandrokelman@hotmal.com

  38. #38 por MBallem em 25/11/2012 - 2:46

    Olá elessandro, o projeto está disponível para download no final do tutorial.

  39. #39 por elissandro em 25/11/2012 - 5:55

    tem como m dar umas dicas d como eu faço pra passar arquivos?…

  40. #40 por MBallem em 25/11/2012 - 11:33

    elissandro, você vai ter que transformar o arquivo em um stream, ou array de bytes. Depois quando for consumido, você vai precisar fazer o processo contrário.

  41. #41 por elissandro em 25/11/2012 - 19:55

    n tava funcionando aqui mas ja fiz uns testes e ja ta funcionando msm com erro no projecto…eu cnsg receber no eclipse, e quando eu tento enviar so sai a msm respostas no eclipse e nd no topichat…tou fazendo algo errado?

  42. #42 por MBallem em 25/11/2012 - 22:16

    Elissandro, não sei dizer se você está fazendo alguma coisa errada. Se você colocou o projeto pra rodar conforme o tutorial, deveria estar tudo ok.