Obter lista de resultados de uma fila JMS com o mesmo id

4 respostas
E

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;

4 Respostas

johnny_quest

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.

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) {}
	}
}

Mas essa é uma solução caso não se precise consumir de fato a mensagem que se encontra na Queue.

E

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…

johnny_quest

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.
for(MessageText message: list) {

String messageSelector = "JMSMessageID='"+message.getJMSMessageID()+"'";

MessageConsumer consumer = session.createConsumer(destination, messageSelector);

}

*****

Depois é só salvar o consumer em uma lista, com isso consumirá todas as mensagens desejadas.

E

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.

Criado 25 de janeiro de 2012
Ultima resposta 25 de jan. de 2012
Respostas 4
Participantes 2