DOMANDA Problema con semplice applicazione JMS MDB client/server con hornetq su jboss 6.1.0

Pubblicità

Gumball

Nuovo Utente
Messaggi
7
Reazioni
0
Punteggio
24
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:

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
 
Pubblicità
Pubblicità
Indietro
Top