Problemas com EJB3 MDB

Olá pessoal,

estou tentando usar o Message Driven Bean 3, porém ainda não consegui. Tudo o que eu consigo é “deployar” ele com sucesso, porém não consigo enviar uma mensagem para ele através de um cliente. Segue abaixo o meu mdb:

package teste.ejb.mdb;

import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;

import teste.vo.Evento;

@MessageDriven(activationConfig =
{
  @ActivationConfigProperty(propertyName="destinationType",
    propertyValue="javax.jms.Queue"),
  @ActivationConfigProperty(propertyName="destination",
    propertyValue="queue/testQueue")
})
public class ManutencaoBean implements MessageListener {

	public void onMessage(Message msg) {
		try {
			ObjectMessage mensagem = (ObjectMessage) msg;
			Evento evento = (Evento) mensagem.getObject();
			System.out.println("Evento: "+evento.getNome());
			System.out.println("Cliente: "+evento.getCliente().getNome());
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Segue abaixo meu cliente:

package teste;

import java.util.Hashtable;

import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJB;
import javax.ejb.MessageDriven;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.jnp.interfaces.NamingContext;

import teste.ejb.EJBFactory;
import teste.ejb.ManutencaoBean;
import teste.ejb.SessionFacade;
import teste.ejb.SessionFacadeRemote;
import teste.vo.Cliente;
import teste.vo.Evento;
import teste.vo.Manutencao;

public class App {

	public static void main(String[] args) throws NamingException {
		try {
			
			InitialContext ic = new InitialContext();

	        ConnectionFactory cf = (ConnectionFactory) ic.lookup("ConnectionFactory");
	        Queue queue = (Queue)ic.lookup("queue/testQueue");
	        
	        Connection connection = cf.createConnection();
	        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
	        MessageProducer sender = session.createProducer(queue);
	        
	        ObjectMessage msg = session.createObjectMessage();
			
			Cliente cliente = new Cliente();
			cliente.setNome("Jalerson Lima");

			Evento evento = new Evento();
			evento.setNome("Alarme!");
			evento.setCliente(cliente);
			
			msg.setObject(evento);
			
			sender.send(msg);

		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}			
	}
}

O erro é sempre na linha:

ConnectionFactory cf = (ConnectionFactory) ic.lookup("ConnectionFactory");

Segue abaixo o erro:

Exception in thread "main" javax.naming.CommunicationException [Root exception is java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: org.jboss.mq.referenceable.ObjectRefAddr (no security manager: RMI class loader disabled)]
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:722)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
	at javax.naming.InitialContext.lookup(Unknown Source)
	at teste.App.main(App.java:42)
Caused by: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: org.jboss.mq.referenceable.ObjectRefAddr (no security manager: RMI class loader disabled)
	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
	at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:625)
	... 3 more
Caused by: java.lang.ClassNotFoundException: org.jboss.mq.referenceable.ObjectRefAddr (no security manager: RMI class loader disabled)
	at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
	at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
	at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
	at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
	at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
	at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readArray(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)
	... 6 more

Também já tentei chamar por “java:JmsXA” (erro: not bound). Alguém sabe o que está errado?

Obrigado!

Pela seguinte linha de erro:

java.lang.ClassNotFoundException: org.jboss.mq.referenceable.ObjectRefAddr (no security manager: RMI class loader disabled)

Eu descofio que deva ser alguma biblioteca do JBoss faltando no classpath da aplicação cliente… Veja se algum dos seus .jar tem esta classe…

Putz hehehehee era exatamente isso! =D Muito obrigado kra! Vc não sabe o quanto estou agradecido! =D Já tava desistindo, mas agora que está funcionando, essa noite não tem cama! Ainda bem que comprei coca-cola pra me manter acordado =D vlww mesmo!

Estou com problemas no meu MDB, está dando o seguinte erro na hora em que o Jboss tenta acessar ele:

Seria mais fácil se você fosse mais explícito em relação a quem está tentando acessar quem. O JBoss está tentando acessar o MDB? A fila? O erro ocorre quando a mensagem é enviada? Quando ela é recebida?

Envie o StackTrace completo do erro que está acontecento… Provavelmente você está tentando fazer um cast da mensagem que você está recebendo para um tipo de mensagem diferente do que ela é…

ola, criei um exemplo simples utilizando topico, não gera nenhum erro, porém o MDB não lê a mensagem do topico… alguem poderia me ajudar??? segue meu exemplo …valeu!!!

Cliente produtor

import java.util.Properties;

import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class JMSTopicSendClient {

public static void main(String[] args) {
	try {
		
		
		InitialContext ctx = getInitialContext();
		Topic topic = (Topic) ctx.lookup("topic/mdbTopic");

		TopicConnectionFactory factory = (TopicConnectionFactory)
		ctx.lookup("TopicConnectionFactory");
		TopicConnection connection =
			factory.createTopicConnection();
		TopicSession session = connection.createTopicSession(
				false, TopicSession.AUTO_ACKNOWLEDGE);
		MessageProducer producer = session.createProducer(topic);
		ObjectMessage objectMessage = session.createObjectMessage();
		
		Pessoa pessoa = new Pessoa();
		pessoa.setNome("Vander");
		pessoa.setCidade("Sao Paulo");
		pessoa.setEndereco("Rua Bela Cintra");
		pessoa.setTelefone("34343434");  

		objectMessage.setObject(pessoa);
		
		producer.send(objectMessage);
		connection.start();
		connection.close();
		
		
	} catch (Exception ex) {
		ex.printStackTrace();
	}
}

public static InitialContext getInitialContext() throws NamingException{
	Properties env = new Properties();
	env.put(Context.SECURITY_PRINCIPAL, "guest");
	env.put(Context.SECURITY_CREDENTIALS, "guest");		
	env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.security.jndi.JndiLoginInitialContextFactory");
	env.put(Context.PROVIDER_URL, "jnp://localhost:1099");
	
	return new InitialContext(env);
}

}


MDB


import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName = “destinationType”,
propertyValue = “javax.jms.Topic”),
@ActivationConfigProperty(propertyName = “destination”,
propertyValue = “topic/testTopic”)
}
)
public class MDBCicloVida implements MessageListener {

@PersistenceContext(unitName="mdb")
private EntityManager em;

public void onMessage(Message message) {
	
	try {
		
		ObjectMessage objectMessage = (ObjectMessage)message;	
		Pessoa pessoa = (Pessoa)objectMessage.getObject();
		System.out.println("Nome: "+pessoa.getNome());
		System.out.println("Endereco: "+pessoa.getEndereco());
		em.persist(pessoa);
		
		
	} catch (JMSException e) {
		e.printStackTrace();
	}
	
}

}