Newsgroup: it.lavoro.informatica
Titolo: domanda per esperti WebSphere (e j2ee in generale)

Se c'e' qualche esperto, chiederei dove posso documentarmi sulla
seguente cosa :
Da un lato c'e' un'applicazione j2ee che e' deployata su Tomcat. 
Dall'altro lato c'e' (o meglio, ancora non c'e' ma poi ci sara') un'
applicazione che utilizzera' websphere.
<premessa>
Ora, se non sono un superesperto di Tomcat, praticameente non so nulla
di websphere per cui in quanto diro' di seguito ci potranno essere varie
cavolate... correggetemi pure
</premessa>
Da quanto mi hanno detto la parte "websphere" dovra' gestire un sistema
di queuing che, sempre da quanto mi hanno detto, dovra' essere gestito
tramite un qualcosa (modulo ?) chiamato WebSphere MQ.
Fino a ieri dicevano che la parte su Tomcat avrebbe banalmente dovuto
chiamare un web service esposto da un "sistema terzo"  (almeno dal punti
di vista logico e' un sistema terzo) e in questo modo il "sistema terzo"
avrebbe provveduto ad inserire nelle opportune code i messaggi.
Da a qualcuno e' venuto in mente  invece che l'applicazione che e' su
Tomcat dovra' interagire direttamente con quella che e' su websphere,
implementando un client per MQ series versione 6.0.2.
Domanda:
Qualcuno conosce qualche "posto" dove si possa rintracciare qualche
esempio di codice di un client per WebSphere per l'inserimento
di messaggi in un sistema di queuing (ammesso che tale client sia
possibile poi deployarlo su Tomcat, cosa della quale non sono ancora
convinto al 100%, visto che non sono nemmeno sicuro che Tomcat abbia il
supporto per JMS, essendo un servlet container e non un vero e proprio
AS). O anche dove si possa rintracciare una documentazione chiara a tale
proposito (client per MQ da far girare su Tomcat).
Ciao e  Grazie in anticipo.
Marco.

 (client per MQ da far girare su Tomcat).
il jms è uno standard jee, quindi non devi cercare codice per websphere. 
puoi googlare alla ricerca di "jms client tutorial" e trovi materiale 
abbondante ed esempi da cui partire.
così come il client può essere tranquillamente il tomcat come una 
qualsiasi applicazione non-jee (ma anche non java, si trovano connettori 
anche per .net ad esempio).
ps: scrivere un client è banale e puoi anche approcciare il jms col 
modello "scatola nera". non è però quello che ti consiglio. 
 

  
Ok, grazie.
Ciao,
Marco

 e' necessario che si usi solo  cio' che e' aderente allo standard jms.
quello che ti ha detto stitikit e' giusto, ha un rapporto conflittuale
con l'italiano, la logica e la vita in generale ma un minimo di j2ee
lo mastica.. uno dei punti forti di j2ee e' quello di essere uno
standard portabile su piattaforme di vari "vendor", quindi fatte salve
situazioni particolarmente "esotiche" non rispettare lo standard vuol
dire volersi fare del male. Il fatto che abbiano chiesto espressamente
un client "per MQ series 6.0.2" e' probabilmente dovuto a "eccesso di
zelo", ignoranza, o entrambe le cose :)

 tramite un qualcosa (modulo ?) chiamato WebSphere MQ.
Webshere MQ e' il sistema di message enqueing di IBM. Nel Websphere 
Application Server c'e' un Webshere MQ che l'application server utilizza 
e mette a disposizioni delle applicazioni.
Ogni coda definita in Webshere MQ puo' ma non obbligtoriamente, essere 
gestita come destinazione JMS. Inoltre tali definizioni utilizzano uno 
spazio JNDI che tipicamente e' LDAP ma puo' essere anche FileSystem o 
un'altro provider JNDI. Ciò che dovrà fare il tuo Tomcat, sara' di 
caricarsi il jndi.properties che vorranno fornirti (in genere basta 
mettere il file nel classpath catalina).
A questo punto devi solo sapere il nome del ConnectionFactory e della 
coda, ed il client, per inviare un testo,  funzionera' grosso modo cosi':
String
   message = "il mio messaggio",
   factoryName = "nomefactory",
   queueName = "nomecoda";
javax.naming.Context jndiContext = new InitialContext();
javax.jms.ConnectionFactory connectionFactory =
    (javax.jms.ConnectionFactory)jndiContext.lookup(factoryName);
javax.jms.Queue queue =
    (javax.jms.Queue) jndiContext.lookup(queueName);
javax.jms.Connection connection =
    connectionFactory .createConnection();
javax.jms.Session session =
    connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
javax.jms.MessageProducer producer =
   session.createProducer(queue);
javax.jms.TextMessage textMessage =
   session.createTextMessage();
textMessage.setText(message);
producer.send(textMessage);
connection.close();
Per inviare messaggi di altro tipo utilizzerai gli opportuni metodi di 
session, ad esempio:
ObjectMessage objectMessage = session.createObjectMessage();
per scodare un messaggio dovrai usare un consumer,
javax.jms.MessageConsumer consumer =
   session.createConsumer(queue);
javax.jms.Message received = consumer.receive();
oppure utilizzare il suo bel listener:
consumer.setMessageListener(new javax.jms.MessageListener(){
   public void onMessage(Message received ) {
     // ...
   }});
dopodichè dovrai individuare la specializzazione del Message ricevuto 
(ObjectMessage , TextMessage etc.)
Volendo invece utilizzare direttamente le API di MQ, dovrai partire 
creando un MQEnvironment che grosso modo ha la stessa funzione del 
jndicontext, quindi impostare le proprietà host, porta e service 
channel, creare un MQQueueManager, ottenere l'istanza della coda MQQueue 
ed utilizzare i metodi put e get di MQQueue per inserire o prelevare 
MQMessage. In particolare, differentemente da JMS, dovrai utilizzare il 
metodo commit() di MQQueueManager per "fissare ogni transazione.
Le classi di MQ sono (direi tutte) nel package 
com.ibm.mq
 che dovrebbe 
provarsi nel file com.ibm.mq.jar nella directory lib di Websphere MQ.
Grosso modo cosi':
MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY,MQC.TRANSPORT_MQSERIES_CLIENT);
MQEnvironment.hostname = "hostName";
MQEnvironment.port = 1414; (che e' la porta di default)
MQEnvironment.channel = "channelName";
MQQueueManager queueManager = new MQQueueManager("queueManager");
int options = MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE |MQC.MQOO_SET;
MQQueue queue =
   queueManager .accessQueue("nomecoda", options, null, null, null);
MQMessage message = new MQMessage();
message .format = MQC.MQFMT_STRING ;
message .messageFlags = MQC.MQMT_REQUEST ;
message.writeString("il mio messaggio");
queue.put(message, new MQPutMessageOptions());
queueManager.commit();
queueManager.close();

 ha scritto:
[SNIP]
Grazie anche a te per la risposta dettagliata.
Ciao,
Marco