Информациони системи 1/Лаб 1 2020
Задатак 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);
}
}
}
}