web-dev-qa-db-fra.com

Publication d'un message dans la file d'attente JMS à l'aide de JAVA

Je suis nouveau sur JMS, après une longue recherche, j'ai cherché un code sur Google pour me connecter à JMS et poster un msg.

Le problème est que je dois poster le message dans une file d’attente distante, mais je ne sais pas comment établir la connexion et poster le message.

TYPE DE SERVEUR : TIBCO EMS
SERVER Host : **. ***** . Net
PORT: * ** Nom d'utilisateur : utilisateur
passsword : user123
File d'attente : *. * . .. .Order.Management. . 1

Je voudrais établir la connexion, poster un simple msg et le récupérer. Veuillez aider! Merci d'avance

CODE QUE J'AI OBTENU D'INTERNET

import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStreamReader;
import Java.util.Hashtable;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class emm {


         // Defines the JNDI context factory.
         public final static String JNDI_FACTORY="com.tibco.tibjms.naming.TibjmsInitialContextFactory";

         // Defines the JMS context factory.
         public final static String JMS_FACTORY="jms/TestConnectionFactory";

         // Defines the queue.
         public final static String QUEUE="CPW.GBR.POR.Public.Request.Order.Management.UpdateProvisioningStatus.1";

         private QueueConnectionFactory qconFactory;
         private ConnectionFactory conFactory;
         private QueueConnection qcon;
         private QueueSession qsession;
         private QueueSender qsender;
         private Queue queue;
         private TextMessage msg;

         /**
          * Creates all the necessary objects for sending
          * messages to a JMS queue.
          *
          * @param ctx JNDI initial context
          * @param queueName name of queue
          * @exception NamingException if operation cannot be performed
          * @exception JMSException if JMS fails to initialize due to internal error
          */
         public void init(Context ctx, String queueName)
            throws NamingException, JMSException
         {

            qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
            qcon = qconFactory.createQueueConnection();
            qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            queue = (Queue) ctx.lookup(queueName);
            qsender = qsession.createSender(queue);
            msg = qsession.createTextMessage();
            qcon.start();
         }

         /**
          * Sends a message to a JMS queue.
          *
          * @param message  message to be sent
          * @exception JMSException if JMS fails to send message due to internal error
          */
         public void send(String message) throws JMSException {
            msg.setText(message);
            qsender.send(msg);
         }

         /**
          * Closes JMS objects.
          * @exception JMSException if JMS fails to close objects due to internal error
          */
         public void close() throws JMSException {
            qsender.close();
            qsession.close();
            qcon.close();
         }
        /** main() method.
         *
         * @param args WebLogic Server URL
         * @exception Exception if operation fails
         */
         public static void main(String[] args) throws Exception {
            if (args.length != 1) {
             System.out.println("Usage: Java examples.jms.queue.QueueSend WebLogicURL");
             return;
            }
            InitialContext ic = getInitialContext(args[0]);
            emm qs = new emm();
            qs.init(ic, QUEUE);
            readAndSend(qs);
            qs.close();
         }

         private static void readAndSend(emm qs)
            throws IOException, JMSException
         {
            BufferedReader msgStream = new BufferedReader(new InputStreamReader(System.in));
            String line=null;
            boolean quitNow = false;
            do {
             System.out.print("Enter message (\"quit\" to quit): \n");
             line = msgStream.readLine();
             if (line != null && line.trim().length() != 0) {
               qs.send(line);
               System.out.println("JMS Message Sent: "+line+"\n");
               quitNow = line.equalsIgnoreCase("quit");
             }
            } while (! quitNow);

         }

         private static InitialContext getInitialContext(String url)
            throws NamingException
         {
            Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
            env.put(Context.PROVIDER_URL, url);
            return new InitialContext(env);
         }
        }
6
Ragesh Kr

Enfin, de différentes sources, j'ai trouvé le meilleur moyen de résoudre ce problème. Ce code fonctionnera certainement. J'ai essayé ceci et tourne actuellement sur ma machine

import Java.util.Properties;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.*;

public class JMSExample {

    static String serverUrl = "tcp://10.101.111.101:10001"; // values changed
    static String userName = "user";
    static String password = "pwd";

     static QueueConnection connection;
     static QueueReceiver queueReceiver;
     static Queue queue;

    static TextMessage message;

    public static void sendTopicMessage(String topicName, String messageStr) {

        Connection connection = null;
        Session session = null;
        MessageProducer msgProducer = null;
        Destination destination = null;


        try {
            TextMessage msg;

            System.out.println("Publishing to destination '" + topicName
                    + "'\n");

            ConnectionFactory factory = new com.tibco.tibjms.TibjmsConnectionFactory(
                    serverUrl);

            connection = factory.createConnection(userName, password);


            session = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);



            destination = session.createQueue(topicName);


            msgProducer = session.createProducer(null);



            msg = session.createTextMessage();

            msg.setStringProperty("SourceId", userName);
            msg.setStringProperty("BusinessEvent", password);


            msg.setText(messageStr);


            msgProducer.send(destination, msg);



            System.out.println("Published message: " + messageStr);


            connection.close();

        } catch (JMSException e) {
            e.printStackTrace();
        }
    }



    public static void main(String[] args) throws JMSException {
        // TODO Auto-generated method stub

        JMSExample.sendTopicMessage("***.***.***.**.**.Order.Management.***.1",
                "Hi");
        //System.out.println(getMessage());

    }
5
Ragesh Kr

Comme je l’ai mentionné, un code d’inspiration ( LÉGÈREMENT amélioré votre code. Ce n’est pas quelque chose que je voudrais voir en production! )

// Use the domain-agnostic API
private Connection connection;ery 
private Session session;
private MessageProducer producer;
private Queue queue;

public void init(Context ctx, String queueName) {

    try {
        ConnectionFactory cnf = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
        queue = (Queue) ctx.lookup(queueName);


        connection = cnf.createConnection("user", "user123");
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        producer = session.createProducer(queue);

        connection.start();
    } catch (NamingException e) {
        throw new RuntimeException(e);
    } catch (JMSException e) {
        throw new RuntimeException(e);
    }
}

Et faites votre envoi comme ceci (ne réutilisez pas le même objet Message, mais créez-en un pour chaque message que vous envoyez)

public void send(String message) throws JMSException {
    TextMessage msg = session.createTextMessage();
    msg.setText(message);
    producer.send(msg);
}

Mettez un essai..enfin sur le code dans votre méthode principale:

    try {
        readAndSend(qs);
    } finally {
        qs.close();
    }

Le code que vous utilisez n'est pas très bon (euphémisme). Il est programmé trop fragile pour un système de production. Vous ne devriez pas utiliser l'état comme ce programme. 

De plus, il n'est pas nécessaire d'utiliser l'API JMS spécifique au domaine. Vous pouvez utiliser le nom de domaine (file d'attente/sujet).

Lorsque vous exécutez le programme, transmettez l’URL JNDI de votre serveur TIBCO.

2
raphaëλ