Информациони системи 1/Лаб 1 2021

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Група Б

Посматра се процес за прављење новогодишњих пакетића. Три радника праве ратлук, бомбоне и чоколадице, респективно. Слаткиши су инстанце класа Ратлук, Бомбона, Чоколадица. Дакле, направљени слаткиш радник шаље унутар објектне поруке у ред за прављење који је заједнички за све раднике. Радник када направи слаткиш чека између 3 и 6 секунди (са униформном расподелом) и креће са прављењем новог слаткиша. Све делове из реда за прављење прикупља вилењак који ради само склапање пакетића. Сваки пакетић састоји се из тачно једног ратлука, једне бомбоне и једне чоколадице. Када прикупи сва три различита слаткиша која су прва пристигла (није дозвољено да складишти више слаткиша истог типа), вилењак од њих прави пакетић који је представљен класом Пакетић која у себи има референце на своја три слаткиша. Вилењак шаље све направљене пакетиће на тему. Деда Мраз преузима пакетиће са те теме. Потребно је омогућити да један пакетић преузме само један Деда Мраз. Слање и пријем сваке поруке је потребно исписати на главном излазу.

Решење

Пре покретања у Глассфисх направити Qуеуе са називом myQueue и Топиц са називом myTopic, док такође треба да постоји подразумевани Цоннецтион Фацторy jms/__defaultConnectionFactory. Радници треба да се налазе у одвојеним пројектима како би могли да се покрећу одвојено, док остали пакети могу да се налазе у свим пројектима.

slatkisi пакет

Овај пакет мора бити у сва три пројекта како би процеси успешно размењивали поруке.

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 + "]";
    }
}

paketic пакет

Овај пакет мора да се налази и у пројекту са Вилењаком и у пројекту са Деда Мразом.

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 пакет

RadnikRatluk.java

Представља раднике РадникРатлук, РадникБомбона и РадникЦокоалдица. Покренути три пута мењајући 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() * 3 + 3) * 1000);
                Thread.sleep(wait);
            } catch (InterruptedException | JMSException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

vilenjak пакет

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 пакет

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 paketic");
                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);
            }
        }
    }    
}