Problemas com MDB no JBoss 5.0

4 respostas
Baldao

Olá,

Estou tento um problema para executar um MDB no JBoss 5.0. O usuário através de um servlet chama a classe Messenger que é a responsável por postar a mensagem em uma fila JMS:

package com.jboss.ejb.teste.message;

import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.QueueConnectionFactory;
import javax.jms.Session;
import javax.naming.InitialContext;

public class Messenger {

	private QueueConnectionFactory connectionFactory;
	private Destination destination;
	
	public Messenger() {
		try {
			InitialContext ctx = new InitialContext();
			
			connectionFactory = (QueueConnectionFactory) ctx.lookup("java:/ConnectionFactory");
			destination = (Destination) ctx.lookup("queue/JBossTesteQueue");
		}
		catch (Exception exc) {
			exc.printStackTrace();
		}
	}
	
	public void sendMessage(String nome) {
		try {
			Connection connection = connectionFactory.createQueueConnection();
			Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

			MessageProducer producer = session.createProducer(destination);
			
			ObjectMessage message = session.createObjectMessage();
			message.setObject(nome);
			
			producer.send(message);
			
			session.close();
			connection.close();
			
			System.out.println("Mensagem enviada com sucesso!");
		}
		catch (Exception exc) {
			exc.printStackTrace();
		}
	}
	
}

Esta classe funciona perfeitamente, porém o MDB não roda de jeito nenhum... eis o código:

package com.jboss.ejb.teste.message;

import java.text.SimpleDateFormat;
import java.util.Date;

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;

@MessageDriven(
	    mappedName = "MessageConsumer",
	    activationConfig = {
	        @ActivationConfigProperty(
	            propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
	        @ActivationConfigProperty(
	            propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
	        @ActivationConfigProperty(
	            propertyName = "destination", propertyValue = "queue/JBossTesteQueue")
	    }
	)
public class MessageConsumer implements MessageListener {

	@Resource
	private MessageDrivenContext context;
	
	public void onMessage(Message message) {
		try {
			ObjectMessage objectMessage = (ObjectMessage) message;
			
			String time = new SimpleDateFormat("dd/MM/yyyy - HH:mm:ss").format(new Date());
			System.out.println("Mensagem recebida em " + time);
			System.out.println("Content: " + objectMessage.getObject());
		}
		catch (JMSException exc) {
			exc.printStackTrace();
			context.setRollbackOnly();
		}
	}

}

Este é o arquivo ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0">
  <display-name>JBossEJBTeste_ejb</display-name>
  <enterprise-beans>
    <message-driven>
      <ejb-name>MessageConsumer</ejb-name>
      <ejb-class>com.jboss.ejb.teste.message.MessageConsumer</ejb-class>
      <transaction-type>Container</transaction-type>
      <message-destination-type>javax.jms.Queue</message-destination-type>
    </message-driven>
  </enterprise-beans>
</ejb-jar>

e este é o jboss.xml

<?xml version="1.0" encoding="UTF-8"?>

<jboss>
	<enterprise-beans>
		<message-driven>
			<ejb-name>MessageConsumer</ejb-name>
			<configuration-name>Standard Message Driven Bean</configuration-name>
			<destination-jndi-name>queue/JBossTesteQueue</destination-jndi-name>
			<activation-config>
				<activation-config-property>
					<activation-config-property-name>destinationType</activation-config-property-name>
					<activation-config-property-value>javax.jms.Queue</activation-config-property-value>
				</activation-config-property>
			</activation-config>
		</message-driven>
	</enterprise-beans>
</jboss>

A fila foi criada desta forma no arquivo destinations-service.xml

<mbean code="org.jboss.jms.server.destination.QueueService"
      name="jboss.messaging.destination:service=Queue,name=JBossTesteQueue"
      xmbean-dd="xmdesc/Queue-xmbean.xml">
      <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
      <depends>jboss.messaging:service=PostOffice</depends>
   </mbean>

Gostaria de saber o que pode estar errado, pois não consegui fazer o MDB rodar de jeito nenhum. Nenhuma exceção é lançada durante o deploy e o JBoss informa que iniciou o MDB corretamente.

Agradeço a quem puder ajudar

4 Respostas

Baldao

Ninguém nunca passou por um problema parecido? :shock:

vantarban

Baldão, estou com o mesmo problema, vc conseguiu identificar o que tinha de errado?

Abraços
Vanderlei

Lord

Olá Baldão tenta fazer a seguinte alteração:
Modificar o seguinte trecho,

@ActivationConfigProperty(
	            propertyName = "destination", propertyValue = "queue/JBossTesteQueue")

Por este :

@ActivationConfigProperty(
	            propertyName = "destination", propertyValue = "/queue/JBossTesteQueue")

Faz um teste ae.Eu utilizo o JBoss 5.1.0 e meus MDB`s são configurados assim.
Qualquer problema posta ae …

L

Caros,

Estou com o mesmo problema, aparentemente ele starta o MDB corretamente, mas nada acontece :smiley:

Lord, testei com a barra na frente e continuou na mesma…

A única coisa que aparece no log do jboss é:

15:45:56,753 INFO [EJBContainer] STARTED EJB: com.test.TestMDB ejbName: TestMDB

E fica nisso…

Lá no JMX Console onde aparece a fila configurada, ela está lá, e em Consumer Count aparece sempre 0 (zero). Ou seja o MDB não está conectado na fila. Mas está tudo certinho aparentemente, igual ao dos amigos acima. Estou usando Jboss 5.1.0 integrado ao HornetQ 2.1.2.

Help us

Criado 28 de abril de 2009
Ultima resposta 6 de set. de 2010
Respostas 4
Participantes 4