4. JMS

4.1. Kolejkowanie 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");

4.1.1. 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();
            } 
      }
   }

4.1.2. 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();
            } 
      }
   }

4.2. 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

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

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

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

4.3. Tymczasowe kojeki prywatne (np. na potrzeby obsługi odpowiedzi)

4.3.1. Tworzenie

TemporaryQueue tmp = sess.createTemporaryQueue();
TextMessage tmsg = sess.createTextMessage("Hej!");
tmsg.setJMSReplyTo(tmp);

4.3.2. Wykorzystanie do przekazania odpowiedzi

TextMessage tmsg, ack;
tmsg = (TextMessage)cons.receive();
ack = sess.createTextMessage("OK!");
MessageProducer prod_ack = sess.createProducer(tmsg.getJMSReplyTo());
prod_ack.send(ack);

4.4. Zadanie projektowe

Replikacja serwera usługi, zrealizowanej ramach zadania z RMI [do 30 pkt. (zależnie od zaawansowania mechanizmu replikacji)]