Observer-Muster

Danke für die Antworten.

Leider ist mir das ISink bzw. ISource Beispiel nicht ganz klar. Wo kann ich denn Dokumentation zu ISource finden?

@limago: Ich würde mich über Beispiele freuen, da die Datenbank meinen Informationen zu Folge Java untertützt.

Gruß
Mauri
 
Hi,

mein Post ist wohl etwas dazwischengeraten. Die Sache von Thomas ist eine (sehr elegante) Alternative zum klassischen Observer. Der Code dokumentiert sich selbst ;-).Mein Post behandelt nur Deine Anfrage bezüglich Datenbanken. Ich verwende als JMS den JBoss-ApplicationServer. Auf dem Wikipedia Link sind auch noch andere freie Produkte aufgeführt. Dazu später mehr.

Zunächst ein einfacher MessageConsumer. Er baut analog zu einer Datenbank Connection zunächst eine Connection zum JMS auf. Dann wird über Umwege ein Receiver-Object aufgebaut und die Klasse registriert sich dort als Empfänger. Jetzt feuert immer die onMessage-Methode, wenn eine Nachricht am JMS anliegt. Dieses Beispiel empfängt nur String-Nachrichten, im Prinzip kann man aber statt TextMessage auch ObjectMessage verwenden, dann kannst Du alle serialisierbaren Objecte verschicken und empfangen.

Java:
package de.limago.jms;

import java.util.Properties;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class MessageConsumer implements MessageListener{
	
	
	// Herstellerspezifischer Treiber. Treiber muss im Classpath liegen
	// Im Falle des Jboss, einfach die JbossAllClient.jar aus dem JBOSS-Client Verzeichnis verwenden
	private static final String CONTEXT_FACTORY = "org.jnp.interfaces.NamingContextFactory";
	
	// Auch JBOSS spezifisch
	private static final String PROVIDER_URL ="jnp://localhost:1099";
	private static final String CONNECTION_FACTORY = "ConnectionFactory";
	
	// Name der Queue (Postfach) das ich auf dem JBOSS angelegt habe...
	private static final String QUEUE ="queue/tutorials";
	
	public MessageConsumer() throws Exception {
		
		
		// Erzeugen der Receivers und registrieren des MessageConsumers...
		Properties props = new Properties();
		props.put(Context.INITIAL_CONTEXT_FACTORY,CONTEXT_FACTORY );
		props.put(Context.PROVIDER_URL,PROVIDER_URL );
	
		InitialContext ic = new InitialContext(props);
		
		QueueConnectionFactory qcf = (QueueConnectionFactory) ic.lookup(CONNECTION_FACTORY);
		QueueConnection queueConnection = qcf.createQueueConnection();
		QueueSession queueSession = queueConnection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
	
		Queue queue = (Queue) ic.lookup(QUEUE);
		
		QueueReceiver receiver = queueSession.createReceiver(queue);
		
		receiver.setMessageListener(this);
		queueConnection.start();
		
	}

	
	public static void main(String[] args) throws Exception{
		new MessageConsumer();

	}

	public void onMessage(Message msg) {
		
		try {
			if (msg instanceof TextMessage)
				System.out.println(((TextMessage)msg).getText());
			else
				System.out.println("Falscher Nachrichtentyp");
		} catch (JMSException e) {
			
			e.printStackTrace();
		}
		
		
	}

}

Und jetzt der Sender. Prinzipiell müsste der aus einem Datenbank-Trigger angestossen werden. Dazu musst Du ihn entsprechend umbauen.

Java:
package de.limago.jms;

import java.util.Properties;

import javax.jms.Destination;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class MessageProducer {
	
	private static final String CONTEXT_FACTORY = "org.jnp.interfaces.NamingContextFactory";
	private static final String PROVIDER_URL ="jnp://localhost:1099";
	private static final String CONNECTION_FACTORY = "ConnectionFactory";
	private static final String QUEUE ="queue/tutorials";
	
	public MessageProducer() throws Exception{
		
		System.out.println("Start");
		Properties props = new Properties();
		props.put(Context.INITIAL_CONTEXT_FACTORY,CONTEXT_FACTORY );
		props.put(Context.PROVIDER_URL,PROVIDER_URL );
	
		InitialContext ic = new InitialContext(props);
		
		QueueConnectionFactory qcf = (QueueConnectionFactory) ic.lookup(CONNECTION_FACTORY);
		QueueConnection queueConnection = qcf.createQueueConnection();
		QueueSession queueSession = queueConnection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
		
		TextMessage textMessage = queueSession.createTextMessage();
		textMessage.setText("Hallo Welt!");
		//textMessage.setJMSReplyTo( (Queue) ic.lookup(QUEUE));
		
		
		Queue queue = (Queue) ic.lookup(QUEUE);
		QueueSender sender = queueSession.createSender(queue);
		
		
		
		sender.send(textMessage);
		
		System.out.println("Nachricht verschickt!");
		
		
	}

	
	public static void main(String[] args) throws Exception {
		new MessageProducer();

	}

}

Für weitere Infos einfach fragen...

Gruss
 
Zurück