Message-Driven Bean + Response

dadom110

Erfahrenes Mitglied
Tag Zusammen,

ich "spiele" zur Zeit ein wenig mit Message-Driven Beans herrum. Das klassische HalloWelt funktioniert ohne weiteres, aber da die moderne Welt von Kommunikation lebt, soll "die Welt" nun auch Antworten.

Es ist wie gesagt nur eine "technische Demo" (wenn jemand darüber hinaus PraxisTipps hat, wie man so was im "echten" Leben implementieren würde, sage ich natürlich auch nicht "nein")

Versucht wird (falls es denn technisch überhaupt machbar ist ;) ):
JSP->MDB->JSP

Die JSP Seite erstellt eine Temp-Queue, registriert diese mit der Nachricht, verschickt die Nachricht und soll beim Neuladen die Antwort empfangen.

Die JSP:
Java:
<body>
Message Send

<% 
	//Initialize Message Connections
	InitialContext ctx=new InitialContext();
	QueueConnectionFactory qFactory=(QueueConnectionFactory)ctx.lookup("REJMS");
	QueueConnection qConn=qFactory.createQueueConnection();
	QueueSession qSession=qConn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
	
	
	//Recive Old Message
	Object o=session.getAttribute("tq");
	QueueReceiver qReciver;
	TemporaryQueue responseQ;
	if (o==null){
		responseQ=qSession.createTemporaryQueue();
		System.out.println("JSP-TempQueue: " + responseQ.getQueueName());
		qReciver=qSession.createReceiver(responseQ);
		session.setAttribute("tq",qReciver);
		session.setAttribute("rq",responseQ);
	}else {
		qReciver=(QueueReceiver)o;
		responseQ=(TemporaryQueue)session.getAttribute("rq");
		
	}
	
	
	out.write("Response from: " );
	TextMessage responseMessage=(TextMessage)qReciver.receive(1000);
	String text;
	if (responseMessage==null)
		text="No Response";
	else
		text=responseMessage.getText();
	
	out.println(text);
	

	// New Call of Message Bean:
	Queue q=(Queue)ctx.lookup("REJMSR");
	QueueSender qSender=qSession.createSender(q);
	TextMessage txtMessage=qSession.createTextMessage("Eine Nachricht");
	txtMessage.setJMSReplyTo(responseQ);
	qSender.send(txtMessage);
	
%>

</body>


Die MDB:
Java:
@MessageDriven(mappedName="REJMSR")
public class MBean implements MessageListener {

	public void onMessage(Message message) {
		try {
			System.out.println("Message Recive: " + ((TextMessage)message).getText());
			TemporaryQueue replyQ=(TemporaryQueue)message.getJMSReplyTo();
			
			InitialContext ctx=new InitialContext();
			QueueConnectionFactory qFactory=(QueueConnectionFactory)ctx.lookup("REJMS");
			QueueConnection qConn=qFactory.createQueueConnection();
			QueueSession qSession=qConn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
			
			QueueSender sender=qSession.createSender(replyQ);
			sender.send(qSession.createTextMessage("Reply From Message Bean"));
			System.out.println("Response Send to " + replyQ.getQueueName());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


Output sieht dann so aus:
INFO: JSP-TempQueue: temporary_destination://queue/10.1.0.154/6347298447043360003/1
INFO: DirectConsumer:Caught Exception delivering messagecom.sun.messaging.jmq.io.Packet cannot be cast to com.sun.messaging.jms.ra.DirectPacket
INFO: Message Recive: Eine Nachricht
INFO: Response Send to temporary_destination://queue/10.1.0.154/6347298447043360003/1


== die JSP erzeugt eine Temp-Queue, die bei der Bean auch ankommt und an die geantwortet wird, Ergebnis ist leider das, das keine Nachricht beim Neuladen der JSP abgerufen werden kann.

Hoffe auf gute Ideen :)

Grüße
D
 
Zuletzt bearbeitet:
1. Frage: Warum ein JSP wenn du grad 2 Zeilen HTML da drin hast?
2. Frage: Warum asynchron, wenn du eigentlich eine synchrone Antwort erwartest?

3. Problem: Angenommen, du würdest das halbwegs sauber machen (ein richtiger MessageListener der an der Returnqueue lauscht und ein Servlet, was dessen Status über ein JSP anzeigt). Wer hält dann die Messages, sobald sie aus der Queue raus sind? Willst du immer alle Nachrichten anzeigen die zurückkamen? Dann muss die jemand (persistent) halten. Willst du immer nur die Nachrichten sehen, die seit dem letzten Aufruf in die Queue geflogen kamen hast du ein Problem bzgl. potentiell mehrerer Aufrufer des Servlets.

Ergo: Asynchronität macht Spass, braucht aber auch konzeptionelles Umdenken und bringt hier und da mehr Aufwandt mit sich.

Gruß
Ollie
 
Bin völlig einverstanden mit deinen Einwänden. Ich dachte durch meinen Eingangspost hätte ich derlei Belehrungen verhindern können.

"technische Demo"

Die Anwendung ist völlig nutzlos, sinnlos und schlecht konzeptioniert, darüber bin ich mir im klaren. Es ging mir rein um die technische Realisierung von biderektionaler Kommunkation zwischen JSP und Server via MDBs.

Back to Topic: Jemand eine Idee, warum die Nachrichten beim "Clienten" nicht ankommen, obwohl der Reciver, alsauch die Antwort die selbe Queue verwenden?

Grüße
D
 
Ich hatte vermutet, du hast das hier ernst gemeint ;):
...(wenn jemand darüber hinaus PraxisTipps hat, wie man so was im "echten" Leben implementieren würde, sage ich natürlich auch nicht "nein")

IMHO macht es auch keinen Sinn, Request und Reply in einen Channel zu packen. MessageQueues sind gerichtete Konstrukte. D.h. wenn du als Listener wieder etwas in die Queue packst, aus der du liest, kommt die Nachricht eben wieder bei dir an. D.h. für einen Request/Response per JMS brauchst du 2 separate Channel.

Ein JSP ist dann halt eben kein MessageListener, von daher kannst du aus einem JSP heraus auch keine Messages empfangen. IMHO macht es mehr Sinn 2 dedizierte MessageListener zu haben, die über dedizierte Queues miteinander kommunizieren und evtl. Statistik über die entsprechend empfangenen/gesendeten Nachrichten zu führen. Diese kann man dann über ein JSP visualisieren. Um eine Nachricht über ein HTML Formular abzuschicken empfiehlt es sich ein Servlet zu verwenden und dass dann die Nachricht in die entsprechende Queue stellen zu lassen.

Meine Fragen oben waren auch nicht polemisch gemeint, sondern durchaus aus praktischem Grund. MJan tut gut daran, sich beim Thema asynchronität erst tief mit den Konzepten, den technischen Artefakten, ihren Aufgaben und Möglichkeiten vertraut zu machen und für die jeweilige Aufgabe das richtige zu wählen (wie schon x-fach betont ist ein JSP kein geeigneter MessageListener/-Sender... ich vermute, du verstehst worauf ich hinaus will).

Als gutes Beispiel kann ich ActiveMQ und dessen Beispielprojekte empfehlen. Das bringt jede Menge Samples mit sich, wie man asynchrone Nachrichten über HTTP (genauer gesagt eine REST-SChnittstelle) empfängt usw. http://activemq.apache.org/

Gruß
Ollie
 

Neue Beiträge

Zurück