Domanda

Sembra semplice ma non riesco a trovare una risposta semplice.

Voglio aprire una connessione a un broker JMS remoto (sono noti IP e porta), aprire una sessione su una specifica coda (nome noto) e inviare un messaggio a questa coda.

Esiste una semplice API Java (standard se possibile) per farlo?


Modifica

Ok, ora capisco che JMS è una specifica del driver proprio come JDBC e non un protocollo di comunicazione come pensavo.

Dato che sto correndo in JBoss, non capisco ancora come creare un JBossConnectionFactory .


Modifica

In realtà ho pensato al problema (hmmm) e se JMS deve essere trattato come JDBC, allora devo usare un client fornito dalla mia implementazione MQ. Dato che stiamo usando SonicMQ per il nostro broker, ho deciso di incorporare la libreria sonic_Client.jar fornita con SonicMQ.

Funziona in un'applicazione Java autonoma e nel nostro servizio JBoss.

Grazie per l'aiuto

È stato utile?

Soluzione

Dovrai usare JMS, creare un QueueConnectionFactory e andare da lì. Il modo esatto in cui si crea il QueueConnectionFactory sarà specifico del fornitore (JMS è fondamentalmente una specifica del driver per le code dei messaggi proprio come JDBC è per i database) ma su IBM MQ è qualcosa del genere:

MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory();
connectionFactory.setHostName(<hostname>);
connectionFactory.setPort(<port>);
connectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
connectionFactory.setQueueManager(<queue manager>);
connectionFactory.setChannel("SYSTEM.DEF.SVRCONN");

QueueConnection queueConnection = connectionFactory.createQueueConnection();
QueueSession queueSession = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

Queue queue = queueSession.createQueue(<queue name>);

QueueSender queueSender = session.createSender(queue);
QueueReceiver queueReceiver = session.createReceiver(queue); 

MODIFICA (dopo la modifica della domanda)

Il modo migliore per accedere a una coda remota, o qualsiasi coda, è aggiungere un'istanza Queue al registro JNDI. Per le code remote questo viene ottenuto usando MBean che aggiungono l'istanza Queue all'avvio del server.

Dai un'occhiata a http://www.jboss.org/community/wiki/UsingWebSphereMQSeriesWithJBossASPart4 , che sebbene sia un esempio con IBM MQ, è essenzialmente ciò che devi fare per connetterti a qualsiasi coda remota.

Se guardi jbossmq-destinazioni-service.xml e org.jboss.mq.server.jmx vedrai gli MBean che devi creare in relazione in una coda JBoss.

Altri suggerimenti

Ecco il codice che abbiamo usato per connetterci al broker SonicMQ usando la libreria sonic_Client.jar :

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;


public class JmsClient
{
    public static void main(String[] args) throws JMSException
    {
        ConnectionFactory factory = new progress.message.jclient.ConnectionFactory("tcp://<host>:<port>", "<user>", "<password>");
        Connection connection = factory.createConnection();

        try
        {
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            try
            {
                MessageProducer producer = session.createProducer(session.createQueue("<queue>"));
                try
                {
                    producer.send(session.createTextMessage("<message body>"));
                }
                finally
                {
                    producer.close();
                }
            }
            finally
            {
                session.close();
            }
        }
        finally
        {
            connection.close();
        }
    }
}

In realtà sto usando JBoss 4 e JNDI non è difficile da usare.

Prima di tutto devi sapere dove è in esecuzione il tuo JNDI.

Nel mio JBoss (conf \ jboss-service.xml) ho:

<mbean code="org.jboss.naming.NamingService" name="jboss:service=Naming" xmbean-dd="resource:xmdesc/NamingService-xmbean.xml">
    ...
    <attribute name="Port">7099</attribute>
    ...
</mbean>

Questo è importante, questa è la porta a cui vuoi connetterti.

Ora puoi connetterti facilmente a JNDI usando questo codice:

Hashtable<String, String> contextProperties = new Hashtable<String, String>();
contextProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
contextProperties.put(Context.PROVIDER_URL, "jnp://localhost:7099");

InitialContext initContext = new InitialContext(contextProperties);

Ora, quando hai un contesto, è molto simile alla risposta di @Nick Holt, ad eccezione della creazione della factory di connessione, devi usare:

QueueConnectionFactory connFactory = (QueueConnectionFactory) initContext.lookup("ConnectionFactory");

Inoltre non è necessario creare una coda se ne è stata distribuita una parte

Queue queue = (Queue) initContext.lookup("queueName");

Tutto il codice sopra è stato testato con JBoss 4.2.2 GA e JBossMQ (se ho ragione, JBossMQ è stato sostituito in 4.2.3 con la messaggistica JBoss).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top