Problemas ao tentar consumir Fila JMS com JBoss 6 e 7

Java

30/03/2012

Estou com problemas para consumir mensagens de uma fila JMS no JBoss 6 e o mesmo problema ocorre também no JBoss 7.

Envio uma mensagem para a fila sem problemas, mas quando tento consumir essa mensagem através da da interface MessageListener e do método onMessage() não consigo recuperar nem uma mensagem, é como se a instrução consumer.setMessageListener(this) não chamasse o método onMessage(). E não é lançada nenhuma exceção.

Dai troquei a instrução de consumo por consumer.receiver(1000), deixando de lado a interface MessageListener. Porém se estou com o JBoss rodando e envio uma mensagem, só consigo consumir se eu restartar o JBoss. Dai, se caso envie outra mensagem, terei novamente que restartar.

O código que uso funciona perfeitamente no Jboss 4.2.3 e no ActiveMQ, é claro alterando as configurações do JNDI, mas quando tento consumir no JBoss 6 e 7 acabo tendo esse problema.

Alguém tem alguma ideia sobre o que pode ser?
Obs: Não estou usando EJB.
Marcio Souza

Marcio Souza

Curtidas 0

Respostas

Dyego Carmo

Dyego Carmo

30/03/2012

Poderia colar seus beans aqui ? (tanto o producer quando o cosumer) ?

Valeu !
GOSTEI 0
Marcio Souza

Marcio Souza

30/03/2012


import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Properties;

public class JMSConsumer implements MessageListener {

    private static final String JBOSS_CONNECTION_FACTORY_NAMES = ConnectionFactory; 

    private static final String JNDI_QUEUE = queue/testQueue;

    private static final String USER = guest;

    private static final String PASSWORD = guest;

    private InitialContext initialContext;

    private Connection connection;

    private MessageConsumer consumer;

    public void receiver() {
        initialContext = getInitialContext();
        try {
            ConnectionFactory connectionFactory =
                    (ConnectionFactory) initialContext.lookup(JBOSS_CONNECTION_FACTORY_NAMES);

            connection = connectionFactory.createConnection(USER, PASSWORD);

            connection.start();

            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            Destination destination = (Destination) initialContext.lookup(JNDI_QUEUE);

            consumer = session.createConsumer(destination);

            consumer.setMessageListener(this);
        } catch (JMSException e) {
            e.printStackTrace();
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onMessage(Message message) {
        try {
            if (message instanceof TextMessage) {
                TextMessage textMessage = (TextMessage) message;
                System.out.println(textMessage.getText());
            }

            if (message instanceof ObjectMessage) {
                ObjectMessage objectMessage = (ObjectMessage) message;
                System.out.println(objectMessage.getObject());
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }

        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private InitialContext getInitialContext() {
        Properties properties = new Properties();
        properties.put(Context.INITIAL_CONTEXT_FACTORY, org.jnp.interfaces.NamingContextFactory);
        properties.put(Context.PROVIDER_URL, jnp://localhost:1099);
        properties.put(Context.SECURITY_PRINCIPAL, USER);
        properties.put(Context.SECURITY_CREDENTIALS, PASSWORD);
        InitialContext context = null;
        try {
            context = new InitialContext(properties);
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return context;
    }

    public static void main(String[] args) {
        new JMSConsumer().receiver();
    }
}


Para o JBoss 7 uso esta configuração:
namingcontextfactory = org.jboss.naming.remote.client.InitialContextFactory
connectionFactory = jms/RemoteConnectionFactory
url = remote://localhost:4447
destination = jms/queue/test
user = user
pass = pass

Consigo enviar as mensagens pelo produtor, mas o consumidor não consome elas. Acabei incluindo o Spring na jogada, e felizmente passou a consumir, mas não entendo porque com código puro, tanto no Jboss 6 e 7 o consumidor não captura as mensagens enquanto com o mesmo código capturo sem problemas no ActiveMQ e JBoss 4.2.3
GOSTEI 0
Marcio Souza

Marcio Souza

30/03/2012

Acabei esquecendo do producer:
import com.wp.mballem.myproducer.bean.MyFirstBean;

import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.io.Serializable;
import java.util.Date;
import java.util.Properties;

public class JMSProducer {
    private static final String JBOSS_CONNECTION_FACTORY_NAMES = ConnectionFactory;

    private static final String JNDI_QUEUE = queue/testQueue;

    private static final String USER = guest;

    private static final String PASSWORD = guest;

    private InitialContext initialContext;

    private Connection connection ;

    private MessageProducer producer;

    private String text;

    private Object object;
    
    public JMSProducer(String text) {
        this.text = text;
    }

    public JMSProducer(Object object) {
        this.object = object;
    }

    public void sender() {
        initialContext = getInitialContext();
        try {
            ConnectionFactory connectionFactory =
                    (ConnectionFactory) initialContext.lookup(JBOSS_CONNECTION_FACTORY_NAMES);

            connection = connectionFactory.createConnection(USER, PASSWORD);

            connection.start();

            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            Destination destination = (Destination) initialContext.lookup(JNDI_QUEUE);

            producer = session.createProducer(destination);

            if (text != null) {
                TextMessage textMessage = session.createTextMessage(text);
                producer.send(textMessage);
            }

            if (object != null) {
                ObjectMessage objectMessage = session.createObjectMessage((Serializable) object);
                producer.send(objectMessage);
            }

            System.out.println(Success...);
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            close();
        }
    }

    private void close() {
        try {
            if (initialContext != null) {
                initialContext.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

    private InitialContext getInitialContext() {
        Properties properties = new Properties();
        properties.put(Context.INITIAL_CONTEXT_FACTORY, org.jnp.interfaces.NamingContextFactory);
        properties.put(Context.PROVIDER_URL, jnp://localhost:1099);
        properties.put(Context.SECURITY_PRINCIPAL, USER);
        properties.put(Context.SECURITY_CREDENTIALS, PASSWORD);
        InitialContext context = null;
        try {
            context = new InitialContext(properties);
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return context;
    }

    public static void main(String[] args) {
        MyFirstBean bean1 = new MyFirstBean();
        bean1.setUuid(System.currentTimeMillis());
        bean1.setText(Mensagem JBoss id:  + bean1.getUuid());
        bean1.setDate(new Date());

        new JMSProducer(bean1).sender();

        MyFirstBean bean2 = new MyFirstBean();
        bean2.setUuid(System.currentTimeMillis());
        bean2.setText(Mensagem JBoss id:  + bean2.getUuid());
        bean2.setDate(new Date());
        new JMSProducer(bean2.toString()).sender();
    }
}
GOSTEI 0
POSTAR