Olá pessoal, sou novo aqui nesse grupo, e já chego com uma dúvida!
Estou iniciando com EJB3, no momento estou estudando MDB. Então segue a dúvida.
Fiz uma aplicação chat para propósitos de estudo que funciona da seguinte forma:
1- Cada cliente se conecta ao servidor através de um EJB stateful que armazena dados do usuario (por enquanto só o apelido) após ele se conectar.
2- Através de um método remote, o usuário invoca um método do EJB, que manda um topic de nome “chatTopic”.
3- Cada usuário já assina esse “chatTopic” e recebe as mensagens
Até aqui tudo funcionando muito bem, contudo, para fins de estudo decidi fazer uma modificação, e assim que ficaria a aplicação:
1- Cada cliente se conecta ao servidor através de um EJB stateful que armazena dados do usuario (por enquanto só o apelido) após ele se conectar.
2- Através de um método remote, o usuário manda mensagens para o EJB, que manda um topic ou queue de nome “chatTopic”.
3- Um MDB recebe esse “chatTopic” faz algum tratamento na mensagem (como inibir certas palavras, ou por no log, não decidi ainda).
4- O MDB envia essa mensagem tratada para um topic de nome "clientTopic"
5- Cada usuário já assina esse “clientTopic” e recebe as mensagens
Aqui que está dando problema. No cliente o código é esse:
levanta o NamingException, pois o clientTopic não existe. Existe alguma forma que eu possa criá-lo?
Encontrei um work around colocando um MDB que recebe o “clientTopic” mas não faz nada. Dessa forma o “clientTopic” é registrado. Mas tem alguma forma menos gambiarreira?
Valeu por ter lido até aqui!
Desculpe a demora para responder, mas eu estive sem internet o fds. Sobre a solução: funcionou sim! Muito obrigado. Contudo agora está aparecendo umas mensagens no log do servidor. Fica dando esse warn:
E quando alguém manda uma mensagem aparece essa exceção:
14:49:30,421 ERROR [JmsServerSession] org.jboss.resource.adapter.jms.inflow.JmsServerSession@88485f failed to commit/rollback
javax.transaction.HeuristicMixedException
at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1397)
at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135)
at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:87)
at org.jboss.resource.adapter.jms.inflow.JmsServerSession$XATransactionDemarcationStrategy.end(JmsServerSession.java:494)
at org.jboss.resource.adapter.jms.inflow.JmsServerSession.run(JmsServerSession.java:248)
at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:204)
at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:275)
at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:756)
at java.lang.Thread.run(Unknown Source)
Segue as classes:
O Session Bean:
@Stateful
public class ChatSessionBean implements RemoteChat{
String usuario;
@Resource(mappedName="TopicConnectionFactory") private TopicConnectionFactory factory;
public void falar(String message) throws JMSException, NamingException {
if(usuario==null){
throw new NullPointerException("Usuário não logado");
}
message=usuario+": "+message;
Connection con=factory.createConnection();
Session session=con.createSession(true, 0);
Topic topic=(Topic) getInitialContext().lookup("topic/chatTopic");
MessageProducer sender=session.createProducer(topic);
ObjectMessage oMsg=session.createObjectMessage();
oMsg.setObject(message);
sender.send(oMsg);
con.close();
}
public InitialContext getInitialContext() throws NamingException{
InitialContext context=new InitialContext();
return context;
}
public void login(String usuario) throws JMSException, NamingException {
this.usuario=usuario;
this.falar(usuario+" entrou na sala.");
}
}
Apesar de mostrar essas mensagens de erro no log do JBoss, para o cliente, é transparente. A aplicação funciona normalmente.
Agradeço desde já qualquer ajuda.
EDIT: debugando descobri que o erro acontece após a execução do onMessage() da classe Chat.