lunedì, febbraio 05, 2007

J2EE FORUM

Una classe java per inviare messaggi su una coda jms, che vengono scodati
in modalità asincrona.
e così sia..

package it.fastweb.mit.iptv.platform.tvps.test;

import it.fastweb.mit.iptv.platform.tvps.core.msg.TVPSMessageType;

import javax.jms.*;
import javax.naming.*;
import java.util.Hashtable;

public class TVPSJmsTestClient {

// public static final String smqUrl =
// "smqp://localhost:5001/timeout=10000";
public static final String smqUrl = "smqp://10.31.225.28:5001/timeout=10000";
public static final String queueName = "tvps-in-queue@router1";
public static void postMsg(String msgType, String xmlMsg) {
System.out.println("...inPostMsg...");

try {
QueueConnectionFactory queueConnectionFactory = null;
Queue queue = null;
QueueConnection queueConnection = null;
QueueSession queueSession = null;
QueueSender queueSender = null;
String msgText = xmlMsg;
TextMessage message = null;

System.out.println("Queue name is " + queueName);

Hashtable env = new Hashtable();
Context context = null;

env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.swiftmq.jndi.InitialContextFactoryImpl");
env.put(Context.PROVIDER_URL, smqUrl);

context = new InitialContext(env);
queueConnectionFactory = (QueueConnectionFactory) context.lookup("QueueConnectionFactory");
queueConnection = queueConnectionFactory.createQueueConnection();
queueConnection.start();

queueSession = queueConnection.createQueueSession(false,
QueueSession.AUTO_ACKNOWLEDGE);
queue = (Queue) context.lookup(queueName);
System.out.println("found queue " + queueName);
queueSender = queueSession.createSender(queue);
context.close();

queueSender = queueSession.createSender(queue);
message = queueSession.createTextMessage();
message.setText(msgText);
message.setStringProperty("msgType", msgType);

System.out.println("Sending message: " + message.getText());
queueSender.send(message);
} catch (Exception ex) {
System.out.println(".......ECCEZIONE.......");
ex.printStackTrace();
}
}

public static void main(String[] args) {

String[] msgs = new String[10];
String[] msgTypes = { "test", "align-identity", "align-loyalty",
"sky-enable-pay-smc", "sky-disable-all-smc",
"sky-enable-oppv-smc" };

msgs[0] = "\n"
+ "\n"
+ "1234567890\n"
+ "\n"
+ "PIPPO\n"
+ "PLUTO\n" + "\n"
+ "\n";

msgs[1] = "\n"
+ "\n"
+ "1234567890\n"
+ "\n"
+ "bibble22\n" + "\n"
+ "\n";


int num = 3;
postMsg(msgTypes[num], msgs[num]);

}
}

6 commenti:

Anonimo ha detto...

Grazie mi serviva proprio.. magari se la prossima volta ti spieghi come un normale uomo terreno potrei anche capirti.. ciao

Filo ha detto...

ma io nn sn un normale uomo terreno
perchè dovrei spiegarmi
e poi perchè proprio cn te che nn ti firmi nemmeno ..
pidocchio.

e cmq se te ne intendessi un pochino di java capiresti che è una classe di test che simula un client che inviamessaggi su una coda jms in mod asincrona..
sei terra terra amico..

e lo evidenzi pure..

Anonimo ha detto...

io cercavo informazioni sulla Differenza tra un'applicazione JMS ed un EJB MD e magari poichè ho capito che tu sei un guru di java mi aspettavo delle scuse invece di essere attaccato...
Comuque.. se sei bravo mi piacerebbe che mi spiegassi come un semplice
MDB che stampa a video il contenuto dei messaggi che riceve da una coda ( esso è costituito da una sola classe di nome SimpleMDB)
di seguito il codice

public class SimpleMDB implements MessageDrivenBean,MessageListener{
private transient MessageDrivenContext mdc = null;
private Context context;
public SimpleMDB() {}
public void setMessageDrivenContext(MessageDrivenContext mdc){
this.mdc = mdc;
}

public void ejbCreate() {}
public void onMessage(Message message) {
TextMessage msg = null;
try {
if (message instanceof TextMessage) {
msg = (TextMessage) message;
} else {
System.out.println("msg of wrong type: ");
}
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
}
}
public void ejbRemove() {}
}
si differenzi
da un'applicazione JMS .
Scusami tanto se non sono stato chiaro ma da quello che capito per te non dovrebbe essere un problema.

Filo ha detto...

Scusami ho frainteso il tuo messaggio, non era una risposta appropriata, cmq si nell'applicazione da cui ho preso il codice di quella classe test jms client che ho messo nel blog viene fatto un uso intensiovo di mdb, mi serve un po di tempo, ti vado a prendere la classe che gestisce la stampa su log dei messaggi accodati in coda di test e te la stampo con i commenti.
Ciao

Filo ha detto...

Be la differenza è sostanziale e sta nell'architettura dell'applicazione
nel primo caso ho semplicemente un client che invia messaggi su una coda e uno o più consumers che li ricevono e li notificano, un provider e un servizio di directory (jndi) risolvono destinazioni e connessioni.
Nel caso dell'mdb message driven bean ho un'architettura diversa :
un client che invia mess sulla coda
un server j2ee
un ejb che riceve i messaggi e li processa.
In questo caso è il server j2ee che funge da jms provider smistando i messaggi all'mdb che li processa.
Il metodo onMessage() sull'mdb ha la stessa funzione del TExtListener.java cattura i messagi in modo asincrono , fa il cast con TextMessage e mostra i messaggi a video.
L'unica differenza sta nel rollback che in questo caso viene effettuato quando vienecatturata un'eccezione.
Viene fatto il rollback sulle transazioni cosicchè il mesg venga rispedito.

Giuseppe Morreale ha detto...

A chi interessa l'argomento JMS e MDB vi segnalo un paio di post:

introduzione a jms

esempio su mdb