eu tenho varias mensagens jms com o mesmo cpf. Como eu poderia consumir para retornar todos, como uma lista, ao invés de somente um como abaixo ?
Estou usando jboss5.1.
ConnectionFactory factory = (QueueConnectionFactory) getInitialContext().lookup("/ConnectionFactory");//java:/ConnectionFactory
connection = factory.createConnection();
session = connection.createSession(false, QueueSession.AUTO_ACKNOWLEDGE);
Destination destination = (Destination) getInitialContext().lookup(lookup);
MessageConsumer consumer = session.createConsumer(destination, messageSelector); // cpf= '123456789'
connection.start();
Message message = consumer.receive(5000);
om = (ObjectMessage) message;
Se o modelo utilizado for o one-to-one, então diria para utilizar a classe QueueBrowser, que é uma classe
especializada para olhar todas as mensagens de uma Queue sem consumir tais mensagens.
[code]public class RequestQueueBrowser {
public static void main(String[] args) {
try {
Context context = new InitialContext();
QueueConnectionFactory factory = (QueueConnectionFactory)context.lookup(args[0]);
QueueConnection connection = factory.createQueueConnection();
connection.start();
Queue queue = (Queue) context.lookup(args[1]);
QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueBrowser browser = session.createBrowser(queue);
String CPF = "";
List<TextMessage> list = new ArrayList<TextMessage>();
Enumeration e = browser.getEnumeration();
while (e.hasMoreElements()) {
TextMessage msg = (TextMessage)e.nextElement();
if(msg.getText().equals(CPF)) {
list.add(msg);
}
System.out.println("Browsing: " + msg.getText());
}
browser.close();
connection.close();
System.exit(0);
}
catch (Exception exception) {}
}
}[/code]
Mas essa é uma solução caso não se precise consumir de fato a mensagem que se encontra na Queue.
sim johnny, é one-to-one
O problema é q depois de eu receber a mensagem preciso remover da fila. Já estava considerendo usar a QueueBrower, mas não achei nada ainda que delete essas mensagens da fila após percorrer, somente qdo consome…
Na verdade é possível tirar aquele if no código e passar o seletor diretamente para a QueueBrowser
String messageSelector= "cpf='1234456'";
QueueBrowser queueBrowser = queueSession.createBrowser(queue, messageSelector)
Depois de retornadas todas as mensagens que devem ser consumidas, então você poderá pegar o ID de cada
mensagem e consumir cada uma delas dentro de for passando a lista de ID das mensagens que devem ser consumidas da Queue.
Você pode pegar o header da mensagem JMSMessageID message.getJMSMessageID()
e passar como seletor para consumir somente as mensagens desejadas.
[code]
for(MessageText message: list) {
String messageSelector = “JMSMessageID=’”+message.getJMSMessageID()+"’";
MessageConsumer consumer = session.createConsumer(destination, messageSelector);
}[/code]
Depois é só salvar o consumer em uma lista, com isso consumirá todas as mensagens desejadas.
pra agilizar o processo criei uma classe com uma lista e envio ela para a fila, e consumo apenas uma vez o objeto com a lista, ao invés de várias mensagens na fila … qdo tiver mais tempo tento do jeito que vc falou
valeo.