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

Извор: SI Wiki
< Информациони системи 1
Датум измене: 16. новембар 2021. у 19:38; аутор: KockaAdmiralac (разговор | доприноси) (Postavka (od `<@389896576987824139>`) i rešenje)
(разл) ← Старија измена | Тренутна верзија (разл) | Новија измена → (разл)
Пређи на навигацију Пређи на претрагу

Задатак 1б

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

Решење

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

delovi пакет

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

A.java
package delovi;

import java.io.Serializable;

public class A implements Serializable {
    private final int id;
    public A(int id) {
        this.id = id;
    }
    @Override
    public String toString() {
        return "A[" + id + "]";
    }
}
B.java
package delovi;

import java.io.Serializable;

public class B implements Serializable {
    private final int id;
    public B(int id) {
        this.id = id;
    }
    @Override
    public String toString() {
        return "B[" + id + "]";
    }
}
C.java
package delovi;

import java.io.Serializable;

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

automobil пакет

Овај пакет мора да се налази и у пројекту са радником склапачем и у пројекту са радницима тестерима.

Automobil.java
package automobil;

import delovi.*;
import java.io.Serializable;

public class Automobil implements Serializable {
    private final A a;
    private final B b;
    private final C c;
    
    public Automobil(A a, B b, C c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
    
    @Override
    public String toString() {
        return "Automobil[" + a + ", " + b + "," + c + "]";
    }
}

radnikdelova пакет

RadnikDelova.java

Представља раднике РА, РБ и РЦ. Покренути три пута мењајући PART_NAME.

package radnikdelova;

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 delovi.*;

public class Main {
    @Resource(lookup="jms/__defaultConnectionFactory")
    private static ConnectionFactory connectionFactory;
    
    @Resource(lookup="myQueue")
    private static Queue myQueue;
    
    private static final char PART_NAME = 'A';
    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 (PART_NAME) {
                    case 'A':
                        obj = new A(staticId++);
                        break;
                    case 'B':
                        obj = new B(staticId++);
                        break;
                    case 'C':
                        obj = new C(staticId++);
                        break;
                }
                ObjectMessage objMsg = context.createObjectMessage(obj);
                objMsg.setStringProperty("Type", String.valueOf(PART_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);
            }
        }
    }
}

radniksklapac пакет

RadnikSklapac.java
package radniksklapac;

import automobil.Automobil;
import delovi.*;
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 consumerA = context.createConsumer(myQueue, "Type = 'A'");
        JMSConsumer consumerB = context.createConsumer(myQueue, "Type = 'B'");
        JMSConsumer consumerC = context.createConsumer(myQueue, "Type = 'C'");
        JMSProducer producer = context.createProducer();
        while (true) {
            Message msgA = consumerA.receive();
            System.out.println("Received A");
            Message msgB = consumerB.receive();
            System.out.println("Received B");
            Message msgC = consumerC.receive();
            System.out.println("Received C");
            if (msgA instanceof ObjectMessage && msgB instanceof ObjectMessage && msgC instanceof ObjectMessage) {
                try {
                    ObjectMessage objMsgA = (ObjectMessage)msgA;
                    ObjectMessage objMsgB = (ObjectMessage)msgB;
                    ObjectMessage objMsgC = (ObjectMessage)msgC;
                    A a = (A)objMsgA.getObject();
                    B b = (B)objMsgB.getObject();
                    C c = (C)objMsgC.getObject();
                    Automobil auto = new Automobil(a, b, c);
                    Thread.sleep(5000);
                    System.out.println("Produced " + auto);
                    ObjectMessage autoMsg = context.createObjectMessage(auto);
                    producer.send(myTopic, autoMsg);
                } catch (JMSException | InterruptedException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}

radniktester пакет

RadnikTester.java
package radniktester;

import automobil.Automobil;
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.createSharedDurableConsumer(myTopic, "sub1");
        while (true) {
            try {
                Message msg = consumer.receive();
                System.out.println("Received car");
                if (msg instanceof ObjectMessage) {
                    Automobil auto = (Automobil)((ObjectMessage) msg).getObject();
                    System.out.println("Received " + auto);
                }
            } catch (JMSException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }    
}