Информациони системи 1/Лаб 1 2021 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Grupa A)
м (Dodato rešenje i za grupu A)
 
(Није приказано 5 међуизмена 2 корисника)
Ред 1: Ред 1:
{{tocright}}
== Grupa A ==
== Grupa A ==
Posmatra se proces za pravljenje novogodišnjih paketića. Menadžer svake 5 sekunde na temu šalje tekstualni zahtev proizvodnje slatkiša u formatu <code>"Ratluk p"</code>, <code>"Čokoladica q"</code>, <code>"Bombona r" </code>, gde su ''p'', ''q'' i ''r'' prirodni brojevi koji predstavljaju količinu traženog slatkiša. Tri radnika - RRatluk, RČokoladica i RBombona prihvataju zahteve i proizvode traženi broj slatkiša kao instance objekata. Neophodno je da svaki radnik obradi samo zahteve za svoju vrstu slatkiša i da obradi zahteve koje su pristigli dok nije bio aktivan. Svi radnici instance slatkiša šalju u red. Na kraju reda je Vilenjak, koji svakih 60 sekundi procesira sve slatkiše koji su pristigli u red. Svako slanje i primanje poruka potrebno je ispisati na standardnom izlazu.
Posmatra se proces za pravljenje novogodišnjih paketića. Menadžer svakih 5 sekundi na temu šalje tekstualne zahteve proizvodnje slatkiša u formatu <code>Ratluk ''p''</code>, <code>Cokoladica ''q''</code>, <code>Bombona ''r''</code>, gde su ''p'', ''q'' i ''r'' prirodni brojevi koji predstavljaju količinu traženog slatkiša. Tri radnika - RRatluk, RCokoladica i RBombona prihvataju zahteve i proizvode traženi broj slatkiša kao instance objekata. Neophodno je da svaki radnik obradi samo zahteve za svoju vrstu slatkiša i da obradi zahteve koje su pristigli dok nije bio aktivan. Svi radnici instance slatkiša šalju u red. Na kraju reda je Vilenjak, koji svakih 60 sekundi preuzima sve slatkiše koji su pristigli u red. Svako slanje i primanje poruka potrebno je ispisati na standardnom izlazu.


== Grupa B ==
== Grupa B ==
Posmatra se proces za pravljenje novogodišnjih paketića. Tri radnika prave ratluk, bombone i čokoladice, respektivno. Slatkiši su instance klasa Ratluk, Bombona, Čokoladica. Dakle, napravljeni slatkiš radnik šalje unutar objektne poruke u red za pravljenje koji je zajednički za sve radnike. Radnik kada napravi slatkiš čeka između 3 i 6 sekundi (sa uniformnom raspodelom) i kreće sa pravljenjem novog slatkiša. Sve delove iz reda za pravljenje prikuplja vilenjak koji radi samo sklapanje paketića. Svaki paketić sastoji se iz tačno jednog ratluka, jedne bombone i jedne čokoladice. Kada prikupi sva tri različita slatkiša koja su prva pristigla (nije dozvoljeno da skladišti više slatkiša istog tipa), vilenjak od njih pravi paketić koji je predstavljen klasom Paketić koja u sebi ima reference na svoja tri slatkiša. Vilenjak šalje sve napravljene paketiće na temu. Deda Mraz preuzima paketiće sa te teme. Potrebno je omogućiti da jedan paketić preuzme samo jedan Deda Mraz. Slanje i prijem svake poruke je potrebno ispisati na glavnom izlazu.
: ''Sličan zadatak se pojavio i na [[Информациони системи 1/Лаб 1 2020|prvoj laboratorijskoj vežbi 2020. godine]].''
Posmatra se proces za pravljenje novogodišnjih paketića. Tri radnika prave ratluk, bombone i čokoladice, respektivno. Slatkiši su instance klasa Ratluk, Bombona, Čokoladica. Dakle, napravljeni slatkiš radnik šalje unutar objektne poruke u red za pravljenje koji je zajednički za sve radnike. Radnik kada napravi slatkiš čeka između 3 i 6 sekundi (sa uniformnom raspodelom) i kreće sa pravljenjem novog slatkiša. Sve slatkiše iz reda za pravljenje prikuplja vilenjak koji radi samo sklapanje paketića. Svaki paketić sastoji se iz tačno jednog ratluka, jedne bombone i jedne čokoladice. Kada prikupi sva tri različita slatkiša koja su prva pristigla (nije dozvoljeno da skladišti više slatkiša istog tipa), vilenjak od njih pravi paketić koji je predstavljen klasom Paketić koja u sebi ima reference na svoja tri slatkiša. Vilenjak šalje sve napravljene paketiće na temu. Deda Mraz preuzima paketiće sa te teme. Potrebno je omogućiti da jedan paketić preuzme samo jedan Deda Mraz. Slanje i prijem svake poruke je potrebno ispisati na glavnom izlazu.


=== Rešenje ===
== Rešenje ==
Pre pokretanja u Glassfish napraviti Queue sa nazivom <code>myQueue</code> i Topic sa nazivom <code>myTopic</code>, dok takođe treba da postoji podrazumevani Connection Factory <code>jms/__defaultConnectionFactory</code>. Radnici treba da se nalaze u odvojenim projektima kako bi mogli da se pokreću odvojeno, dok ostali paketi mogu da se nalaze u svim projektima.
Pre pokretanja u Glassfish napraviti Queue sa nazivom <code>myQueue</code> i Topic sa nazivom <code>myTopic</code>, dok takođe treba da postoji podrazumevani Connection Factory <code>jms/__defaultConnectionFactory</code>. Radnici treba da se nalaze u odvojenim projektima kako bi mogli da se pokreću odvojeno, dok ostali paketi mogu da se nalaze u svim projektima.


==== <code>slatkisi</code> paket ====
=== <code>slatkisi</code> paket ===
Ovaj paket mora biti u sva tri projekta kako bi procesi uspešno razmenjivali poruke.
Ovaj paket mora biti u projektima Radnik i Vilenjak za grupu A i svim projektima za grupu B kako bi procesi uspešno razmenjivali poruke.


===== <code>Ratluk.java</code> =====
==== <code>Ratluk.java</code> ====
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
package slatkisi;
package slatkisi;
Ред 29: Ред 32:
</syntaxhighlight>
</syntaxhighlight>


===== <code>Bombona.java</code> =====
==== <code>Bombona.java</code> ====
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
package slatkisi;
package slatkisi;
Ред 47: Ред 50:
</syntaxhighlight>
</syntaxhighlight>


===== <code>Cokoladica.java</code> =====
==== <code>Cokoladica.java</code> ====
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
package slatkisi;
package slatkisi;
Ред 65: Ред 68:
</syntaxhighlight>
</syntaxhighlight>


=== Grupa A ===
==== <code>menadzer</code> paket ====
===== <code>Menadzer.java</code> =====
<syntaxhighlight lang="java">
package menadzer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jms.*;
public class Menadzer {
    @Resource(lookup="jms/__defaultConnectionFactory")
    private static ConnectionFactory connectionFactory;
    @Resource(lookup="myTopic")
    private static Topic myTopic;
    private static void sendRequest(JMSContext context, JMSProducer producer, String type) throws JMSException {
        int amount = (int)(Math.random() * 5) + 1;
        TextMessage msg = context.createTextMessage(type + " " + amount);
        msg.setStringProperty("Type", type);
        producer.send(myTopic, msg);
        System.out.println("Sent " + type + " x" + amount);
    }
    public static void main(String[] args) {
        JMSContext context = connectionFactory.createContext();
        JMSProducer producer = context.createProducer();
        while (true) {
            try {
                sendRequest(context, producer, "Ratluk");
                sendRequest(context, producer, "Cokoladica");
                sendRequest(context, producer, "Bombona");
                Thread.sleep(5000);
            } catch (InterruptedException | JMSException ex) {
                Logger.getLogger(Menadzer.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
</syntaxhighlight>
==== <code>radnik</code> paket ====
===== <code>Radnik.java</code> =====
Predstavlja radnike RRatluk, RCokoladica i RBombona. Pokrenuti tri puta stavljajući naziv slatkiša (<code>Ratluk</code>, <code>Cokoladica</code> ili <code>Bombona</code>) u argumente komandne linije kroz ''Project Properties'' > ''Run'' > ''Arguments''.
<syntaxhighlight lang="java">
package radnik;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jms.*;
import slatkisi.*;
public class Radnik {
    @Resource(lookup="jms/__defaultConnectionFactory")
    private static ConnectionFactory connectionFactory;
    @Resource(lookup="myTopic")
    private static Topic myTopic;
   
    @Resource(lookup="myQueue")
    private static Queue myQueue;
    private static int staticId = 0;
   
    private static Serializable getCandy(String name) {
        switch (name) {
            case "Ratluk": return new Ratluk(staticId++);
            case "Cokoladica": return new Cokoladica(staticId++);
            case "Bombona": return new Bombona(staticId++);
        }
        return null;
    }
   
    public static void main(String[] args) {
        if (args.length != 1) {
            throw new RuntimeException("Must pass candy name as first command-line argument!");
        }
        String candy = args[0];
        if (!(candy.equals("Ratluk") || candy.equals("Cokoladica") || candy.equals("Bombona"))) {
            throw new RuntimeException("Invalid candy name!");
        }
        JMSContext context = connectionFactory.createContext();
        JMSProducer producer = context.createProducer();
        JMSConsumer consumer = context.createSharedDurableConsumer(myTopic, "sub" + candy, "Type = '" + candy + "'");
        while (true) {
            try {
                Message msg = consumer.receive();
                if (msg instanceof TextMessage) {
                    String text = ((TextMessage)msg).getText();
                    System.out.println("Received " + text);
                    int amount = Integer.parseInt(text.split(" ")[1]);
                    for (int i = 0; i < amount; ++i) {
                        Serializable candyObj = getCandy(candy);
                        producer.send(myQueue, context.createObjectMessage(candyObj));
                        System.out.println("Sent " + candyObj);
                    }
                } else {
                    System.err.println("Received non-text message!");
                }
            } catch (JMSException ex) {
                Logger.getLogger(Radnik.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
</syntaxhighlight>
==== <code>vilenjak</code> paket ====
===== <code>Vilenjak.java</code> =====
<syntaxhighlight lang="java">
package vilenjak;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jms.*;
public class Vilenjak {
    @Resource(lookup="jms/__defaultConnectionFactory")
    private static ConnectionFactory connectionFactory;
    @Resource(lookup="myQueue")
    private static Queue myQueue;
    public static void main(String[] args) {
        JMSContext context = connectionFactory.createContext();
        JMSConsumer consumer = context.createConsumer(myQueue);
        while (true) {
            try {
                Message msg = consumer.receiveNoWait();
                if (msg == null) {
                    System.out.println("Nothing in queue, sleeping");
                    Thread.sleep(60000);
                } else if (msg instanceof ObjectMessage) {
                    System.out.println("Received " + ((ObjectMessage)msg).getObject());
                } else {
                    System.err.println("Received non-object message!");
                }
            } catch (InterruptedException | JMSException ex) {
                Logger.getLogger(Vilenjak.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
</syntaxhighlight>
=== Grupa B ===
==== <code>paketic</code> paket ====
==== <code>paketic</code> paket ====
Ovaj paket mora da se nalazi i u projektu sa Vilenjakom i u projektu sa Deda Mrazom.
Ovaj paket mora da se nalazi i u projektu sa Vilenjakom i u projektu sa Deda Mrazom.
Ред 95: Ред 250:
==== <code>radnici</code> paket ====
==== <code>radnici</code> paket ====
===== <code>RadnikRatluk.java</code> =====
===== <code>RadnikRatluk.java</code> =====
Predstavlja radnike RadnikRatluk, RadnikBombona i RadnikCokoaldica. Pokrenuti tri puta menjajući <code>CANDY_NAME</code>.
Predstavlja radnike RadnikRatluk, RadnikBombona i RadnikCokoladica. Pokrenuti tri puta menjajući <code>CANDY_NAME</code>.
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
package radnici;
package radnici;
Ред 247: Ред 402:
             try {
             try {
                 Message msg = consumer.receive();
                 Message msg = consumer.receive();
                 System.out.println("Received paketic");
                 System.out.println("Received present");
                 if (msg instanceof ObjectMessage) {
                 if (msg instanceof ObjectMessage) {
                     Paketic paketic = (Paketic)((ObjectMessage) msg).getObject();
                     Paketic paketic = (Paketic)((ObjectMessage) msg).getObject();
Ред 259: Ред 414:
}
}
</syntaxhighlight>
</syntaxhighlight>
[[Категорија:Информациони системи 1]]
[[Категорија:Лабораторијске вежбе]]

Тренутна верзија на датум 12. децембар 2021. у 20:23

Grupa A

Posmatra se proces za pravljenje novogodišnjih paketića. Menadžer svakih 5 sekundi na temu šalje tekstualne zahteve proizvodnje slatkiša u formatu Ratluk p, Cokoladica q, Bombona r, gde su p, q i r prirodni brojevi koji predstavljaju količinu traženog slatkiša. Tri radnika - RRatluk, RCokoladica i RBombona prihvataju zahteve i proizvode traženi broj slatkiša kao instance objekata. Neophodno je da svaki radnik obradi samo zahteve za svoju vrstu slatkiša i da obradi zahteve koje su pristigli dok nije bio aktivan. Svi radnici instance slatkiša šalju u red. Na kraju reda je Vilenjak, koji svakih 60 sekundi preuzima sve slatkiše koji su pristigli u red. Svako slanje i primanje poruka potrebno je ispisati na standardnom izlazu.

Grupa B

Sličan zadatak se pojavio i na prvoj laboratorijskoj vežbi 2020. godine.

Posmatra se proces za pravljenje novogodišnjih paketića. Tri radnika prave ratluk, bombone i čokoladice, respektivno. Slatkiši su instance klasa Ratluk, Bombona, Čokoladica. Dakle, napravljeni slatkiš radnik šalje unutar objektne poruke u red za pravljenje koji je zajednički za sve radnike. Radnik kada napravi slatkiš čeka između 3 i 6 sekundi (sa uniformnom raspodelom) i kreće sa pravljenjem novog slatkiša. Sve slatkiše iz reda za pravljenje prikuplja vilenjak koji radi samo sklapanje paketića. Svaki paketić sastoji se iz tačno jednog ratluka, jedne bombone i jedne čokoladice. Kada prikupi sva tri različita slatkiša koja su prva pristigla (nije dozvoljeno da skladišti više slatkiša istog tipa), vilenjak od njih pravi paketić koji je predstavljen klasom Paketić koja u sebi ima reference na svoja tri slatkiša. Vilenjak šalje sve napravljene paketiće na temu. Deda Mraz preuzima paketiće sa te teme. Potrebno je omogućiti da jedan paketić preuzme samo jedan Deda Mraz. Slanje i prijem svake poruke je potrebno ispisati na glavnom izlazu.

Rešenje

Pre pokretanja u Glassfish napraviti Queue sa nazivom myQueue i Topic sa nazivom myTopic, dok takođe treba da postoji podrazumevani Connection Factory jms/__defaultConnectionFactory. Radnici treba da se nalaze u odvojenim projektima kako bi mogli da se pokreću odvojeno, dok ostali paketi mogu da se nalaze u svim projektima.

slatkisi paket

Ovaj paket mora biti u projektima Radnik i Vilenjak za grupu A i svim projektima za grupu B kako bi procesi uspešno razmenjivali poruke.

Ratluk.java

package slatkisi;

import java.io.Serializable;

public class Ratluk implements Serializable {
    private final int id;
    public Ratluk(int id) {
        this.id = id;
    }
    @Override
    public String toString() {
        return "RATLUK[" + id + "]";
    }
}

Bombona.java

package slatkisi;

import java.io.Serializable;

public class Bombona implements Serializable {
    private final int id;
    public Bombona(int id) {
        this.id = id;
    }
    @Override
    public String toString() {
        return "BOMBONA[" + id + "]";
    }
}

Cokoladica.java

package slatkisi;

import java.io.Serializable;

public class Cokoladica implements Serializable {
    private final int id;
    public Cokoladica(int id) {
        this.id = id;
    }
    @Override
    public String toString() {
        return "COKOLADICA[" + id + "]";
    }
}

Grupa A

menadzer paket

Menadzer.java
package menadzer;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jms.*;

public class Menadzer {
    @Resource(lookup="jms/__defaultConnectionFactory")
    private static ConnectionFactory connectionFactory;

    @Resource(lookup="myTopic")
    private static Topic myTopic;

    private static void sendRequest(JMSContext context, JMSProducer producer, String type) throws JMSException {
        int amount = (int)(Math.random() * 5) + 1;
        TextMessage msg = context.createTextMessage(type + " " + amount);
        msg.setStringProperty("Type", type);
        producer.send(myTopic, msg);
        System.out.println("Sent " + type + " x" + amount);
    }

    public static void main(String[] args) {
        JMSContext context = connectionFactory.createContext();
        JMSProducer producer = context.createProducer();
        while (true) {
            try {
                sendRequest(context, producer, "Ratluk");
                sendRequest(context, producer, "Cokoladica");
                sendRequest(context, producer, "Bombona");
                Thread.sleep(5000);
            } catch (InterruptedException | JMSException ex) {
                Logger.getLogger(Menadzer.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

radnik paket

Radnik.java

Predstavlja radnike RRatluk, RCokoladica i RBombona. Pokrenuti tri puta stavljajući naziv slatkiša (Ratluk, Cokoladica ili Bombona) u argumente komandne linije kroz Project Properties > Run > Arguments.

package radnik;

import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jms.*;
import slatkisi.*;

public class Radnik {
    @Resource(lookup="jms/__defaultConnectionFactory")
    private static ConnectionFactory connectionFactory;

    @Resource(lookup="myTopic")
    private static Topic myTopic;
    
    @Resource(lookup="myQueue")
    private static Queue myQueue;

    private static int staticId = 0;
    
    private static Serializable getCandy(String name) {
        switch (name) {
            case "Ratluk": return new Ratluk(staticId++);
            case "Cokoladica": return new Cokoladica(staticId++);
            case "Bombona": return new Bombona(staticId++);
        }
        return null;
    }
    
    public static void main(String[] args) {
        if (args.length != 1) {
            throw new RuntimeException("Must pass candy name as first command-line argument!");
        }
        String candy = args[0];
        if (!(candy.equals("Ratluk") || candy.equals("Cokoladica") || candy.equals("Bombona"))) {
            throw new RuntimeException("Invalid candy name!");
        }
        JMSContext context = connectionFactory.createContext();
        JMSProducer producer = context.createProducer();
        JMSConsumer consumer = context.createSharedDurableConsumer(myTopic, "sub" + candy, "Type = '" + candy + "'");
        while (true) {
            try {
                Message msg = consumer.receive();
                if (msg instanceof TextMessage) {
                    String text = ((TextMessage)msg).getText();
                    System.out.println("Received " + text);
                    int amount = Integer.parseInt(text.split(" ")[1]);
                    for (int i = 0; i < amount; ++i) {
                        Serializable candyObj = getCandy(candy);
                        producer.send(myQueue, context.createObjectMessage(candyObj));
                        System.out.println("Sent " + candyObj);
                    }
                } else {
                    System.err.println("Received non-text message!");
                }
            } catch (JMSException ex) {
                Logger.getLogger(Radnik.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

vilenjak paket

Vilenjak.java
package vilenjak;

import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jms.*;

public class Vilenjak {
    @Resource(lookup="jms/__defaultConnectionFactory")
    private static ConnectionFactory connectionFactory;

    @Resource(lookup="myQueue")
    private static Queue myQueue;

    public static void main(String[] args) {
        JMSContext context = connectionFactory.createContext();
        JMSConsumer consumer = context.createConsumer(myQueue);
        while (true) {
            try {
                Message msg = consumer.receiveNoWait();
                if (msg == null) {
                    System.out.println("Nothing in queue, sleeping");
                    Thread.sleep(60000);
                } else if (msg instanceof ObjectMessage) {
                    System.out.println("Received " + ((ObjectMessage)msg).getObject());
                } else {
                    System.err.println("Received non-object message!");
                }
            } catch (InterruptedException | JMSException ex) {
                Logger.getLogger(Vilenjak.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

Grupa B

paketic paket

Ovaj paket mora da se nalazi i u projektu sa Vilenjakom i u projektu sa Deda Mrazom.

Paketic.java
package paketic;

import slatkisi.*;
import java.io.Serializable;

public class Paketic implements Serializable {
    private final Ratluk ratluk;
    private final Bombona bombona;
    private final Cokoladica cokoladica;
    
    public Paketic(Ratluk ratluk, Bombona bombona, Cokoladica cokoladica) {
        this.ratluk = ratluk;
        this.bombona = bombona;
        this.cokoladica = cokoladica;
    }
    
    @Override
    public String toString() {
        return "PAKETIC[" + ratluk + ", " + bombona + ", " + cokoladica + "]";
    }
}

radnici paket

RadnikRatluk.java

Predstavlja radnike RadnikRatluk, RadnikBombona i RadnikCokoladica. Pokrenuti tri puta menjajući CANDY_NAME.

package radnici;

import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jms.ConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.JMSProducer;
import javax.jms.Queue;
import javax.jms.ObjectMessage;
import slatkisi.*;

public class Main {
    @Resource(lookup="jms/__defaultConnectionFactory")
    private static ConnectionFactory connectionFactory;
    
    @Resource(lookup="myQueue")
    private static Queue myQueue;
    
    private static final String CANDY_NAME = "RATLUK";
    private static int staticId = 0;
    
    public static void main(String[] args) {
        JMSContext context = connectionFactory.createContext();
        JMSProducer producer = context.createProducer();
        while (true) {
            try {
                Serializable obj = null;
                switch (CANDY_NAME) {
                    case "RATLUK":
                        obj = new Ratluk(staticId++);
                        break;
                    case "BOMBONA":
                        obj = new Bombona(staticId++);
                        break;
                    case "COKOLADICA":
                        obj = new Cokoladica(staticId++);
                        break;
                }
                ObjectMessage objMsg = context.createObjectMessage(obj);
                objMsg.setStringProperty("Type", CANDY_NAME);
                producer.send(myQueue, objMsg);
                System.out.println("Sent " + obj);
                int wait = (int)((Math.random() * 4 + 3) * 1000);
                Thread.sleep(wait);
            } catch (InterruptedException | JMSException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

vilenjak paket

Vilenjak.java
package vilenjak;

import paketic.Paketic;
import slatkisi.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jms.ConnectionFactory;
import javax.jms.JMSConsumer;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.JMSProducer;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.ObjectMessage;
import javax.jms.Topic;

public class Main {
    @Resource(lookup="jms/__defaultConnectionFactory")
    private static ConnectionFactory connectionFactory;
    
    @Resource(lookup="myQueue")
    private static Queue myQueue;
    
    @Resource(lookup="myTopic")
    private static Topic myTopic;
    
    public static void main(String[] args) {
        JMSContext context = connectionFactory.createContext();
        JMSConsumer consumerR = context.createConsumer(myQueue, "Type = 'RATLUK'");
        JMSConsumer consumerB = context.createConsumer(myQueue, "Type = 'BOMBONA'");
        JMSConsumer consumerC = context.createConsumer(myQueue, "Type = 'COKOLADICA'");
        JMSProducer producer = context.createProducer();
        while (true) {
            Message msgR = consumerR.receive();
            System.out.println("Received ratluk");
            Message msgB = consumerB.receive();
            System.out.println("Received bombona");
            Message msgC = consumerC.receive();
            System.out.println("Received cokoladica");
            if (msgR instanceof ObjectMessage && msgB instanceof ObjectMessage && msgC instanceof ObjectMessage) {
                try {
                    ObjectMessage objMsgR = (ObjectMessage)msgR;
                    ObjectMessage objMsgB = (ObjectMessage)msgB;
                    ObjectMessage objMsgC = (ObjectMessage)msgC;
                    Ratluk ratluk = (Ratluk)objMsgR.getObject();
                    Bombona bombona = (Bombona)objMsgB.getObject();
                    Cokoladica cokoladica = (Cokoladica)objMsgC.getObject();
                    Paketic paketic = new Paketic(ratluk, bombona, cokoladica);
                    System.out.println("Produced " + paketic);
                    ObjectMessage paketicMsg = context.createObjectMessage(paketic);
                    producer.send(myTopic, paketicMsg);
                    System.out.println("Sent " + paketic);
                } catch (JMSException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}

dedamraz paket

DedaMraz.java
package dedamraz;

import paketic.Paketic;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jms.ConnectionFactory;
import javax.jms.JMSConsumer;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Topic;

public class Main {
    @Resource(lookup="jms/__defaultConnectionFactory")
    private static ConnectionFactory connectionFactory;

    @Resource(lookup="myTopic")
    private static Topic myTopic;

    public static void main(String[] args) {
        JMSContext context = connectionFactory.createContext();
        JMSConsumer consumer = context.createSharedConsumer(myTopic, "sub1");
        while (true) {
            try {
                Message msg = consumer.receive();
                System.out.println("Received present");
                if (msg instanceof ObjectMessage) {
                    Paketic paketic = (Paketic)((ObjectMessage) msg).getObject();
                    System.out.println("Received " + paketic);
                }
            } catch (JMSException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }    
}