Cercare tra i messaggi in coda

Questa volta creiamo un client che ci permette di guardare i messaggi in attesa su una coda senza consumarli.

In pratica il client é molto simile a quelli che consumano i messaggi e abbiamo già visto, con la differenza che il browsing é applicabile solo a code, e che usiamo un oggetto QueueBrowser per accedere la nostra coda.

Il client consiste in due file: Browser.java e Main.java.

Browser

I cambiamenti sono principalmente raccolti nella funzione getMessages(), dove si crea un oggetto QueueBrowser a partire dalla sessione corrente per l'oggetto Queue specificato.

Interessante é il modo di accedere ai messaggi, per cui la classe QueueBrowser mette a disposizione il metodo getEnumeration(), che li ritorna, per l'appunto, come una enumeration.

package browser;

import java.util.Enumeration;
import java.util.Hashtable;
import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Connection;
import javax.jms.Session;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.QueueBrowser;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class Browser {
private static final String AS_URL = "iiop://127.0.0.1:3700";
private static final String AS_CLASS = "com.sun.appserv.naming.S1ASCtxFactory";
private static final String CONNECTION = "jms/tConnectionFactory";
private static final String QUEUE = "jms/tQueue";

private static Queue queue;

private Connection connection;
private Session session;

private static Context ctx;
static {
System.out.println("initializing the context");

Hashtable properties = new Hashtable(2);
properties.put(Context.PROVIDER_URL, AS_URL);
properties.put(Context.INITIAL_CONTEXT_FACTORY, AS_CLASS);
try {
ctx = new InitialContext(properties);
}
catch (NamingException ex) {
ex.printStackTrace();
}
}


public Browser() throws JMSException, NamingException {

ConnectionFactory f = (ConnectionFactory)ctx.lookup(CONNECTION);
connection = f.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
}

public void getMessages() throws JMSException, NamingException {
// ensure the queue is available
if(queue == null) {
System.out.println("Looking for JMS queue");
queue = (Queue)ctx.lookup(QUEUE);
}

QueueBrowser browser = session.createBrowser(queue);
Enumeration<Message> msgs = browser.getEnumeration();

if(!msgs.hasMoreElements()) {
System.out.println("No messages in queue");
}
else {
while(msgs.hasMoreElements()) {
Message tempMsg = msgs.nextElement();
System.out.println("Message: " + tempMsg);
System.out.println("-------");
}
}
}

public void close() throws JMSException {
System.out.println("Closing JMS connection");
if(connection != null)
connection.close();
}
}

Main

Il main crea semplicemente un oggetto di tipo Browser, chiama la getMessage(), chiude la connessione e termina l'esecuzione.

public static void main(String[] args) {
try {
Browser browser = new Browser();
browser.getMessages();
browser.close();
}
catch(Exception ex) {
System.err.println("Consuming failed: " + ex.toString());
ex.printStackTrace();
System.exit(1);
}
System.exit(0);
}

Nessun commento:

Posta un commento