Question

Cela semble simple mais je ne trouve pas de réponse simple.

Je souhaite ouvrir une connexion avec un courtier JMS distant (adresse IP et port connus), ouvrir une session sur une file d'attente spécifique (nom connu) et poster un message dans cette file d'attente.

Existe-t-il une API Java simple (standard si possible) pour le faire?

MODIFIER

Ok, je comprends maintenant que JMS est une spécification de pilote identique à JDBC et non un protocole de communication comme je le pensais.

Étant donné que je cours sous JBoss, je ne comprends toujours pas comment créer un JBossConnectionFactory .

MODIFIER

En fait, j’ai donné au problème certaines idées (hmmm) et si JMS doit être traité de la même manière que JDBC, je dois utiliser un client fourni par mon implémentation MQ. Comme nous utilisons SonicMQ pour notre courtier, j'ai décidé d'intégrer la bibliothèque sonic_Client.jar fournie avec SonicMQ.

Cela fonctionne dans une application Java autonome et dans notre service JBoss.

Merci pour l'aide

Était-ce utile?

La solution

Vous devez utiliser JMS, créer un QueueConnectionFactory et partir de là. La manière dont vous créez le QueueConnectionFactory sera spécifique au fournisseur (JMS est fondamentalement une spécification de pilote pour les files de messages, tout comme JDBC pour les bases de données), mais sur IBM MQ, cela ressemble à ceci:

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); 

MODIFIER (modification de la question suivante)

Le meilleur moyen d'accéder à une file d'attente distante, ou à n'importe quelle file d'attente, consiste à ajouter une instance File d'attente au registre JNDI. Pour les files d'attente distantes, cela est réalisé à l'aide de MBeans qui ajoutent l'instance Queue au démarrage du serveur.

Jetez un coup d'œil à http://www.jboss.org/community/wiki/UsingWebSphereMQSeriesWithJBossASPart4 , qui, s'il est un exemple avec IBM MQ, est essentiellement ce que vous devez faire pour vous connecter à une file d'attente distante.

Si vous regardez jbossmq-destinations-service.xml et org.jboss.mq.server.jmx , vous verrez les MBeans que vous devez créer en relation. dans une file d'attente JBoss.

Autres conseils

Voici le code que nous avons utilisé pour nous connecter au courtier SonicMQ à l'aide de la bibliothèque 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();
        }
    }
}

En fait, j’utilise JBoss 4 et JNDI n’est pas difficile à utiliser.

Tout d'abord, vous devez savoir où se trouve votre JNDI.

Dans mon JBoss (conf \ jboss-service.xml), j'ai:

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

C’est important, c’est le port auquel vous souhaitez vous connecter.

Vous pouvez maintenant vous connecter facilement à JNDI en utilisant le code suivant:

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);

Maintenant, lorsque vous avez un contexte, cela ressemble beaucoup à la réponse de @Nick Holt, à l'exception de la création d'une fabrique de connexions, vous devez utiliser:

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

De plus, vous n'avez pas besoin de créer de file d'attente s'il y a un déploiement

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

Tout le code ci-dessus a été testé avec JBoss 4.2.2 GA et JBossMQ (JBossMQ était, si je ne me trompe pas, remplacé dans la version 4.2.3 par la messagerie JBoss).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top