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

Извор: SI Wiki
< Информациони системи 1
Датум измене: 12. децембар 2021. у 21:23; аутор: KockaAdmiralac (разговор | доприноси) (Dodato rešenje i za grupu A)
(разл) ← Старија измена | Тренутна верзија (разл) | Новија измена → (разл)
Пређи на навигацију Пређи на претрагу

Група А

Посматра се процес за прављење новогодишњих пакетића. Менаџер сваких 5 секунди на тему шаље текстуалне захтеве производње слаткиша у формату Ratluk p, Cokoladica q, Bombona r, где су п, q и р природни бројеви који представљају количину траженог слаткиша. Три радника - РРатлук, РЦоколадица и РБомбона прихватају захтеве и производе тражени број слаткиша као инстанце објеката. Неопходно је да сваки радник обради само захтеве за своју врсту слаткиша и да обради захтеве које су пристигли док није био активан. Сви радници инстанце слаткиша шаљу у ред. На крају реда је Вилењак, који сваких 60 секунди преузима све слаткише који су пристигли у ред. Свако слање и примање порука потребно је исписати на стандардном излазу.

Група Б

Сличан задатак се појавио и на првој лабораторијској вежби 2020. године.

Посматра се процес за прављење новогодишњих пакетића. Три радника праве ратлук, бомбоне и чоколадице, респективно. Слаткиши су инстанце класа Ратлук, Бомбона, Чоколадица. Дакле, направљени слаткиш радник шаље унутар објектне поруке у ред за прављење који је заједнички за све раднике. Радник када направи слаткиш чека између 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 + "]";
    }
}

Група А

menadzer пакет

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

Radnik.java

Представља раднике РРатлук, РЦоколадица и РБомбона. Покренути три пута стављајући назив слаткиша (Ratluk, Cokoladica или Bombona) у аргументе командне линије кроз Пројецт Пропертиес > Рун > Аргументс.

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

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

Група Б

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() * 4 + 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 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);
            }
        }
    }    
}