JMS/OpenMQ

Komunikacja nieustanna — uniezależnienie komunikacji od obecności jej uczestników.

Slajdy do wykładu

Zagadnienia laboratoryjne

Klejkowanie komunikatów (komunikacja P2P)

  1. Utworzenie fabryki połączeń

    javax.jms.ConnectionFactory fact = new com.sun.messaging.ConnectionFactory();
  2. Utworzenie połączenia

    javax.jms.Connection conn = fact.createConnection();
  3. Utworzenie sesji

    javax.jms.Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
  4. Utworzenie kolejki

    javax.jms.Queue que = new com.sun.messaging.Queue("kolejka1");

Umieszczanie komunikatu w kolejce

  1. Utworzenie producenta

    javax.jms.MessageProducer prod = sess.createProducer(que);
  2. Utworzenie komunikatu

    javax.jms.TextMessage tmsg = sess.createTextMessage("Hej!");
  3. Otwarcie połączenia

    conn.start();
    
  4. Przekazanie komunikatu

    prod.send(tmsg);
    
  5. Zamknięcia połączenia

    conn.close();
    

Program p2p_send.java:

   import javax.jms.*;

    class p2p_send {
       public static void main(String[] argv) {
         try {
            ConnectionFactory fact = new com.sun.messaging.ConnectionFactory();
            Connection conn = fact.createConnection();
            Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
         
            Queue que = new com.sun.messaging.Queue("kolejka1");
            MessageProducer prod = sess.createProducer(que);
         
            TextMessage tmsg = sess.createTextMessage("Hej!");
            conn.start();
            prod.send(tmsg);
            conn.close();
         } 
             catch (Exception jmse) {
               System.out.println("Exception occurred : " + jmse.toString());
               jmse.printStackTrace();
            } 
      }
   }

Pobieranie komunikatu z kolejki

  1. Utworzenie konsumenta

    javax.jms.MessageConsumer cons = sess.createConsumer(que);
  2. Deklaracja referecji na potrzeby pobrania komunikatu z kolejki

    javax.jms.TextMessage tmsg;
  3. Otwarcie połączenia

    conn.start();
    
  4. Pobranie komunikatu

    tmsg = (javax.jms.TextMessage)cons.receive();
  5. Zamknięcia połączenia

    conn.close();
    

Program p2p_recv.java:

   import javax.jms.*;

    class p2p_recv {
       public static void main(String[] argv) {
         try {
            ConnectionFactory fact = new com.sun.messaging.ConnectionFactory();
            Connection conn = fact.createConnection();
            Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
         
            Queue que = new com.sun.messaging.Queue("kolejka1");
            MessageConsumer cons = sess.createConsumer(que);
            conn.start();         
            TextMessage tmsg;
            tmsg = (TextMessage)cons.receive();
         
            System.out.println("Odebrano: " + tmsg.getText()); 
            conn.close();
         } 
             catch (Exception jmse) {
               System.out.println("Exception occurred : " + jmse.toString());
               jmse.printStackTrace();
            } 
      }
   }

Publikowanie i subskrybowanie (komunikacja publish-subscribe)

Różnica w stosunku do kolejkowania komunikatówjest tylko w typie środka komunikacji, określanego przy tworzeniu poducenta i konsumenta w ramach sesji.

  1. Utworzenie tematu (zamiast kolejki)

    javax.jms.Topic top = new com.sun.messaging.Topic("temat1");
  2. Utworzenie producenta (publicysty):

    javax.jms.MessageProducer prod = sess.createProducer(top);

    Program publisher.java:

       import javax.jms.*;
    
        class publisher {
           public static void main(String[] argv) {
             try {
                ConnectionFactory fact = new com.sun.messaging.ConnectionFactory();
                Connection conn = fact.createConnection();
                Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
             
                Topic top = new com.sun.messaging.Topic("temat1");
                MessageProducer prod = sess.createProducer(top);
             
                TextMessage tmsg = sess.createTextMessage("Hej!");
                conn.start();
                prod.send(tmsg);
                conn.close();
             } 
                 catch (Exception jmse) {
                   System.out.println("Exception occurred : " + jmse.toString());
                   jmse.printStackTrace();
                } 
          }
       }
    
  3. Utworzenie konsumenta (subskrybenta):

    javax.jms.MessageConsumer cons = sess.createConsumer(top);

    Program subscriber.java:

       import javax.jms.*;
    
        class subscriber {
           public static void main(String[] argv) {
             try {
                ConnectionFactory fact = new com.sun.messaging.ConnectionFactory();
                Connection conn = fact.createConnection();
                Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
             
                Topic top = new com.sun.messaging.Topic("temat1");
                MessageConsumer cons = sess.createConsumer(top);
                conn.start();         
                TextMessage tmsg;
                tmsg = (TextMessage)cons.receive();
             
                System.out.println("Odebrano: " + tmsg.getText()); 
                conn.close();
             } 
                 catch (Exception jmse) {
                   System.out.println("Exception occurred : " + jmse.toString());
                   jmse.printStackTrace();
                } 
          }
       }
    

Proszę zwrócić uwagę na sposób przekazywania wiadomości, gdy najpierw dostawca coś opublikuje, a następnie odbiorca zasubskrybuje dany temat.

Interakcja transakcyjna