Информациони системи 1/Лаб 1 2020
Zadatak 1b
Posmatra se proces za sklapanje automobila. Radnici RA, RB i RC prave delove A, B, C respektivno. Delovi su instance klasa A, B, C. Dakle, sklopljeni deo radnik šalje unutar objektne poruke u red za sklapanje koji je zajednički za sve radnike. Radnik kada napravi deo čeka između 3 i 6 sekundi (sa uniformnom raspodelom) i kreće sa pravljenjem novog dela. Sve delove iz reda za sklapanje prikuplja poseban radnik koji radi samo sklapanje automobila. Svaki automobil sastoji se iz tačno jednog dela A, jednog dela B i jednog dela C. Kada prikupi sva tri različita dela koja su prva pristigla (nije dozvoljeno da skladišti više delova istog tipa), radnik od njih pravi automobil koji je predstavljen klasom Automobil koja u sebi ima reference na svoja tri dela. Radniku je za sklapanje automobila potrebno 5 sekundi i sve sklopljene automobile šalje u posebnu temu za testiranje. Radnici za testiranje preuzimaju automobile sa te teme. Potrebno je omogućiti da radnici za testiranje primaju poruke koje su pristigle i u periodu kada niko nije bio aktivan i da svaki automobil preuzme samo jedan radnik. 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.
delovi paket
Ovaj paket mora biti u sva tri projekta kako bi procesi uspešno razmenjivali poruke.
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 paket
Ovaj paket mora da se nalazi i u projektu sa radnikom sklapačem i u projektu sa radnicima testerima.
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 paket
RadnikDelova.java
Predstavlja radnike RA, RB i RC. Pokrenuti tri puta menjajući 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() * 4 + 3) * 1000);
Thread.sleep(wait);
} catch (InterruptedException | JMSException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
radniksklapac paket
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 paket
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);
}
}
}
}