Oi pessoal.
Bem, estou com um problema com o JMS.
O meu caso é o seguinte:
tenho duas aplicações Java, uma standalone que envia as mensagens e outra no servidor (JBoss 5.0.1 GA com JBoss Messaging) que lê as mensagens. A que está no servidor foi criada com dynamic web project (Eclipse) já que não posso utilizar MDB. Por imposição do projecto em causa, tenho que usar também o ServletContextListener.
Aqui vai a minha aplicação que está no servidor e que lê as mensagens:
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
public class Fornecedor implements ServletContextListener, MessageListener {
private QueueConnection queueConnectionReceive;
public void contextInitialized(ServletContextEvent evento) {
System.out.println("MeuServletContextListener - iniciado: " +
evento.getServletContext().getServerInfo());
try {
InitialContext ctx = new InitialContext();
QueueConnectionFactory cf = (QueueConnectionFactory)ctx.lookup("/ConnectionFactory");
queueConnectionReceive = cf.createQueueConnection();
QueueSession queueSession = queueConnectionReceive.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue1 = (Queue) ctx.lookup("queue/Queue1");
QueueReceiver queueReceiver1 = queueSession.createReceiver(queue1);
Fornecedor queueListener = new Fornecedor();
queueReceiver1.setMessageListener(queueListener);
queueConnectionReceive.start();
System.out.println("Receive ABERTO!!!");
}
catch(Exception e){
e.printStackTrace();
}
}
public void contextDestroyed(ServletContextEvent evento)
{
System.out.println("MeuServletContextListener - finalizado");
try{
if (queueConnectionReceive != null) {
queueConnectionReceive.close();
System.out.println("Receive FECHADO!!!");
}
}
catch (JMSException e){
e.printStackTrace();
}
}
public void onMessage(Message msg){
try{
if (msg instanceof TextMessage){
TextMessage objmsg=(TextMessage) msg;
System.out.println("MENSAGEM RECEBIDA "+objmsg.getText());
}
}
catch (Exception e){
e.printStackTrace();
}
}
}
O problema que estou a ter é este:
java.lang.IllegalStateException: BaseClassLoader@7b6b89ad{vfszip:/C:/JBoss/server/default/deploy/Projecto3Supplier.war/} classLoader is not connected to a domain (probably undeployed?) for class javax.jms.TextMessage
at org.jboss.classloader.spi.base.BaseClassLoader.loadClassFromDomain(BaseClassLoader.java:767)
at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:415)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at server.Fornecedor.onMessage(Fornecedor.java:77)
at org.jboss.jms.client.container.ClientConsumer.callOnMessage(ClientConsumer.java:229)
DEBUG [org.jboss.jms.server.connectionmanager.SimpleConnectionManager] (WorkerThread#1[127.0.0.1:49564]) unregistered connection ConnectionEndpoint[yd-l3rjh4vf-1-zrq9f4vf-31zp0v-t21o4c5] with remoting session ID …-fv4hjr2s-d
at org.jboss.jms.client.container.ClientConsumer$ListenerRunner.run(ClientConsumer.java:1043)
at org.jboss.messaging.util.OrderedExecutorFactory$ChildExecutor.run(OrderedExecutorFactory.java:120)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
O estranho é que o erro só surge intercalado com uma boa entrega da mensagem, ou seja, a primeira vez que faço o send da mensagem ela dá o erro acima, a segunda vez não dá erro e tudo funciona bem, a terceira vez já não funciona, a quarta funciona e assim sucessivamente…
De referir que tenho o ServletContextListener definido no web.xml.
Com toda a certeza deve ser um erro muito facil de detectar, mas só ando de volta do JMS há uns dias…
Agradecia toda a ajuda que me pudessem dar, muito obrigado.
Fiquem bem.