Problemas ao tentar consumir Fila JMS com JBoss 6 e 7
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.
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
Curtidas 0
Respostas
Dyego Carmo
30/03/2012
Poderia colar seus beans aqui ? (tanto o producer quando o cosumer) ?
Valeu !
Valeu !
GOSTEI 0
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
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