Buongiorno a tutti.
Sto cercando di realizzare una semplice applicazione di prova costituita da un MDB che gira su JBoss 6.1.0 (JEE 6) (Hornetq) ed un client stand-alone che invia messaggi sulla coda su cui l'MDB è in ascolto.
Trattandosi di una prova il client manda un semplice messaggio di testo e l'MDB deve solo scrivere il testo del messaggio nel log.
Ci sono svariati esempi su internet ma alcuni riguardano Glassfish altri non specificano esattamente quali sono le librerie che il client deve importare altri considerano solo client locali nel fare la lookup della coda, fatto sta che non sono ancora riuscito a creare nulla di funzionante.
Potreste darmi una mano a far funzionare il mio esempio?
Questo è il codice dell'MDB che ho creato:
E questo è il file hornetq-jms.xml su cui ho definito coda e connection factory:
DOMANADA 1: Devo inserire in questo file i dati "user" e "password" con cui il client fa la ricerca JNDI? Se si come devo fare?
Il deploy sembra funzionare, se accedo al pannello di amministrazione del server trovo sia la coda:
Name: myQueue
JNDI Binding: /queue/myQueue
Address: jms.queue.myQueue
Temporary: false
Paused: false
che il connection factory:
Name: myConnectionFactory
JNDI Bindings: /myConnectionFactory
Questo invece è il codice del client:
Infine questa è la libreria che ho importato, ma sono quasi sicuro che non sia sufficiente e che l'eccezione sia dovuta alla mancanza di altre librerie (quali?):
Se provo a lanciare il client ho la seguente eccezione:
Mi dareste una mano?
Grazie
Sto cercando di realizzare una semplice applicazione di prova costituita da un MDB che gira su JBoss 6.1.0 (JEE 6) (Hornetq) ed un client stand-alone che invia messaggi sulla coda su cui l'MDB è in ascolto.
Trattandosi di una prova il client manda un semplice messaggio di testo e l'MDB deve solo scrivere il testo del messaggio nel log.
Ci sono svariati esempi su internet ma alcuni riguardano Glassfish altri non specificano esattamente quali sono le librerie che il client deve importare altri considerano solo client locali nel fare la lookup della coda, fatto sta che non sono ancora riuscito a creare nulla di funzionante.
Potreste darmi una mano a far funzionare il mio esempio?
Questo è il codice dell'MDB che ho creato:
Codice:
package it.test.mymdb;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
[MENTION=40774]mess[/MENTION]ageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination",
propertyValue = "myQueue")})
public class MyMDB implements MessageListener {
private static final Logger logger = LoggerFactory.getLogger(MyMDB.class);
[MENTION=75845]Override[/MENTION]
public void onMessage(Message message) {
try {
logger.info("Messaggio ricevuto");
TextMessage txtMsg = (TextMessage) message;
logger.info(txtMsg.getText());
}
catch (JMSException ex) {
logger.error("Errore durante la lettura del testo del messaggio.");
}
}
}
E questo è il file hornetq-jms.xml su cui ho definito coda e connection factory:
Codice:
<?xml version="1.0"?>
<configuration xsi:schemaLocation="urn:hornetq /schema/hornetq-jms.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:hornetq">
<connection-factory name="myConnectionFactory">
<connectors>
<connector-ref connector-name="netty"/>
</connectors>
<entries>
<entry name="/myConnectionFactory"/>
</entries>
</connection-factory>
<queue name="myQueue">
<entry name="/queue/myQueue" />
</queue>
</configuration>
DOMANADA 1: Devo inserire in questo file i dati "user" e "password" con cui il client fa la ricerca JNDI? Se si come devo fare?
Il deploy sembra funzionare, se accedo al pannello di amministrazione del server trovo sia la coda:
Name: myQueue
JNDI Binding: /queue/myQueue
Address: jms.queue.myQueue
Temporary: false
Paused: false
che il connection factory:
Name: myConnectionFactory
JNDI Bindings: /myConnectionFactory
Questo invece è il codice del client:
Codice:
package it.test.mymdbclient;
import java.util.Hashtable;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class MyMdbClient {
private final static String JNDI_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory";
private final static String JMS_FACTORY = "myConnectionFactory";
private final static String QUEUE = "queue/myQueue";
private final static String jbossUrl = "remote://localhost:4447";
private static InitialContext getInitialContext() throws NamingException {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, jbossUrl);
env.put(Context.SECURITY_PRINCIPAL, "admin"); //NON SONO SICURO CHE QUESTE SIANO LE CREDENZIALI DI ACCESSO CORRETTE
env.put(Context.SECURITY_CREDENTIALS, "admin");
return new InitialContext(env);
}
public static void main(String[] args) throws Exception {
InitialContext ic = getInitialContext();
QueueConnectionFactory qconFactory = (QueueConnectionFactory) ic.lookup(JMS_FACTORY);
QueueConnection qcon = qconFactory.createQueueConnection("admin", "admin"); //NON SONO SICURO CHE QUESTE SIANO LE CREDENZIALI DI ACCESSO CORRETTE
QueueSession qsession = qcon.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) ic.lookup(QUEUE);
QueueSender qsender = qsession.createSender(queue);
qcon.start();
TextMessage msg = qsession.createTextMessage();
msg.setText("Hello world! :)");
qsender.send(msg);
qsender.close();
qsession.close();
qcon.close();
}
}
Infine questa è la libreria che ho importato, ma sono quasi sicuro che non sia sufficiente e che l'eccezione sia dovuta alla mancanza di altre librerie (quali?):
Codice:
<dependency>
<groupId>org.hornetq</groupId>
<artifactId>hornetq-jms-client</artifactId>
<version>2.3.9.Final</version>
</dependency>
Se provo a lanciare il client ho la seguente eccezione:
Codice:
Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: org.jboss.naming.remote.client.InitialContextFactory [Root exception is java.lang.ClassNotFoundException: org.jboss.naming.remote.client.InitialContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.init(InitialContext.java:244)
at javax.naming.InitialContext.<init>(InitialContext.java:216)
at it.test.mymdbclient.MyMdbClient.getInitialContext(MyMdbClient.java:27)
at it.test.mymdbclient.MyMdbClient.main(MyMdbClient.java:31)
Caused by: java.lang.ClassNotFoundException: org.jboss.naming.remote.client.InitialContextFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:340)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:72)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:61)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:672)
... 5 more
Mi dareste una mano?
Grazie