package javacodebook.xml.transport.jms.p2p; import javax.jms.*; import javax.naming.*; /** * Die XMLQueueReceiver-Klasse benutzt eine Session, um XML-Dokumente in Form * von TextMessages von einer Queue zu lesen. Dabei werden XML-Dokumente als * reine Text-Dokumente behandelt. Das Parsen und eventuelle Validierung muss getrennt * geschehen. */ public class XMLQueueReceiver { private static final String USAGE="\nBenutzerhinweis: javacodebook.xml.transport.jms.p2p.XMLQueueReceiver "+ " \n\nwobei\n\n\ndie Anzahl "+ "der Sekunden ist, die Nachrichten empfangen werden sollen und \n\n\n"+ "der Warteschlangenname ist, von der die Nachrichten empfangen werden sollen"; private long end; /** * An die main-Methode müssen die Parameter und übergeben werden. * In der Methode wird ein XMLQueueReceiver-Objekt instanziiert, es werden die Kommandozeilen-Parameter ausgelesen und die * receiveMessages()-Methode mit den beiden ausgelesenen Parametern und * aufgerufen. */ public static void main(String args[]) { XMLQueueReceiver xMLQueueReceiver=new XMLQueueReceiver(); long timeToReceiveMessages=0; String queueName="not set"; if(args.length!=2) { System.out.println(getUsage()); System.exit(1); } else { try { timeToReceiveMessages=new Long(args[0]).longValue(); } catch(NumberFormatException e) { System.out.println("\nBenutzerhinweis: Bitte als erstes Argument eine Zahl eingeben"); System.exit(1); } queueName=args[1]; } xMLQueueReceiver.receiveMessages(queueName, timeToReceiveMessages); } public void receiveMessages(String queueName, long timeToReceiveMessages) { Context jndiContext = null; QueueConnectionFactory queueConnectionFactory = null; QueueConnection queueConnection = null; QueueSession queueSession = null; Queue queue = null; QueueReceiver queueReceiver = null; setRuntime(timeToReceiveMessages); System.out.println("Queue name is " + queueName); // Erzeugung eines neuen JNDI API InitialContext Objektes try { jndiContext = new InitialContext(); } catch (NamingException e) { System.out.println("Es konnte kein JNDI API Kontext erstellt werden: "+e.toString()); System.exit(1); } // Look-up der Connection-Factory und der Queue. Falls eines der Objekte nicht // gefunden wird, soll die Anwendung verlassen werden. try { queueConnectionFactory = (QueueConnectionFactory)jndiContext.lookup("QueueConnectionFactory"); queue = (Queue) jndiContext.lookup(queueName); } catch (NamingException e) { System.out.println("JNDI API lookup verfehlt: " + e.toString()+"\n\nentweder die QueueconnectionFactory oder die Warteschlange namens "+ queueName+" ist nicht beim Namensdienst registriert"); System.exit(1); } try { // Eine neue Connection wird erzeugt. queueConnection = queueConnectionFactory.createQueueConnection(); // Über die Connection wird ein QueueSession-Objekt erzeugt. Dadurch dass true übergeben wird, // ist die Verbindung transaktional - bei false wäre sie das nicht. Als 2. Parameter wir 0 übergeben um // anzudeuten, dass er bei transaktionalen QueueSessions keine Rolle spielt. Falls keine transaktionale // QueueSession erzeugt wird, muss der 2. Parameter einer der Werte: // * Session.AUTO_ACKNOWLEDGE; // * Session.CLIENT_ACKNOWLEDGE; // * Session.DUPS_OK_ACKNOWLEDGE; // sein. queueSession = queueConnection.createQueueSession(true, 0); // Erzeugung eines QueueReceiver-Objektes über das QueueSession-Objekt queueReceiver = queueSession.createReceiver(queue); // Bevor die Connection benutzt werden kann, muss sie gestartet werden queueConnection.start(); // Beginn der Nachrichtenübertragung. String xmlDocument=null; while (System.currentTimeMillis() [ ...]\n\nwobei\n\n\n"+ "der Name der Warteschlange ist und\n\n [ ...]\n"+ "ein odere mehrer durch Leerzeichen getrennte Dateinamen von XML-Dateien sind, die über"+ " die Warteschlange verschickt werden sollen"; /** * An die main-Methode müssen die Parameter und eine durch Leerzeichen getrennte Folge von * Dateinamen [ ...] übergeben werden. Es wird ein Objekt vom Typ XMLQueueSender instanziiert und die * Kommandozeilenparameter ausgelesen. Nun wird auf das XMLQueueSender-Objekt die Methode sendDocuments() * aufgerufen, wobei der erste Parameter als Warteschlangenname übergeben wird und die restlichen Parameter * in Form eines String-Arrays von XML-Dateinamen übergeben werden. */ public static void main(String args[]) { XMLQueueSender xMLQueueSender=new XMLQueueSender(); if(args.length<2) { System.out.println(getUsage()); System.exit(1); } else { String queueName=args[0]; //Ein neuer String-Array für die XML-Dateinamen wird angelegt. String[] fileNames=new String[args.length-1]; for(int i=1; i und gibt dessen Inhalt als * String zurück. */ private String loadDocument(String fileName) { InputStream is=null; String document=""; try { is=new FileInputStream(fileName); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String line=""; while (line!=null) { document=document+line; line=br.readLine(); } } catch(Exception e) { System.out.println("Probleme beim lesen des Dokuments "+fileName+": "+e); return null; } return document; } public static String getUsage() { return USAGE; } }