OrderedPizzas
Pizzen, die von Köchen gekocht werden sollen.
-
+
+ WantToPay
+ Sobald eine Gruppe fertig gegessen hat, will sie zahlen.
+
+ WantToLeave
+ Alle, die gehen wollen, bzw gegangen sind. Nichts liest aus dieser Queue.
----------------------
Wartende Gruppen
tableprod.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// Create Tables
- for (int i = 0; i < 3; i++) {
+ for (int i = 0; i < 2; i++) {
tableprod.send(session.createObjectMessage(new Table(i)));
}
--- /dev/null
+package at.ac.tuwien.sbc.valesriegler.cook.actions;
+
+import java.io.Serializable;
+
+import at.ac.tuwien.sbc.valesriegler.group.actions.AbstractAction;
+import at.ac.tuwien.sbc.valesriegler.types.PizzaOrderStatus;
+
+public class PizzaInfo extends AbstractAction implements Serializable {
+ private final int pizzaId;
+ private final PizzaOrderStatus status;
+ private final int cookId;
+
+ public PizzaInfo(int pizzaId, PizzaOrderStatus status, int cookId) {
+ super(null);
+ this.pizzaId = pizzaId;
+ this.status = status;
+ this.cookId = cookId;
+ }
+
+ public int getPizzaId() {
+ return pizzaId;
+ }
+
+ public PizzaOrderStatus getStatus() {
+ return status;
+ }
+
+ public int getCookId() {
+ return cookId;
+ }
+
+ @Override
+ public String toString() {
+ return "PizzaInfo [pizzaId=" + pizzaId + ", status=" + status + ", cookId=" + cookId + "]";
+ }
+
+}
import org.slf4j.LoggerFactory;
import at.ac.tuwien.sbc.valesriegler.cook.JMSCook;
+import at.ac.tuwien.sbc.valesriegler.cook.actions.PizzaInfo;
import at.ac.tuwien.sbc.valesriegler.types.Pizza;
import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
+import at.ac.tuwien.sbc.valesriegler.types.PizzaOrderStatus;
public class CookRequestedPizza implements MessageListener {
private static final Logger log = LoggerFactory.getLogger(CookRequestedPizza.class);
// generate random delay
Thread.sleep((long) (pizzaorder.getPizzaType().duration * 1000));
+ pizzaorder.setStatus(PizzaOrderStatus.DONE);
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
- Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer prodCP = session.createProducer(session.createQueue("CookedPizzas"));
prodCP.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
-
prodCP.send(session.createObjectMessage(Pizza.createPizzaFromPizzaOrder(pizzaorder, cook)));
+ MessageProducer wantToSitAtTable = session.createProducer(session.createQueue("PizzeriaConnector"));
+ wantToSitAtTable.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ PizzaInfo pi = new PizzaInfo(pizzaorder.getId(), pizzaorder.getStatus(), cook.getId());
+ wantToSitAtTable.send(session.createObjectMessage(pi));
session.close();
+
connection.close();
} else {
log.warn("Received unknown Object: " + obj);
log.error("EXCEPTION!", e);
}
}
+
+ @Override
+ public String toString() {
+ return "CookRequestedPizza [cook=" + cook + "]";
+ }
}
import at.ac.tuwien.sbc.valesriegler.common.HasId;
import at.ac.tuwien.sbc.valesriegler.group.actions.OrderRequest;
+import at.ac.tuwien.sbc.valesriegler.group.actions.PayRequest;
+import at.ac.tuwien.sbc.valesriegler.group.actions.TableFree;
import at.ac.tuwien.sbc.valesriegler.group.actions.TableRequest;
import at.ac.tuwien.sbc.valesriegler.types.GroupData;
import at.ac.tuwien.sbc.valesriegler.types.GroupState;
break; // do nothing.
case ORDERED:
break; // do nothing.
- case EATING:// just wait some more and request bill.
- // MessageProducer wantToPay =
- // session.createProducer(session.createQueue("WantToPay"));
- // wantToPay.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
- // wantToPay.send(session.createObjectMessage(this));
+ case EATING: // request bill.
+ GroupAgent.getInstance().getGroupcomm().send(new PayRequest(groupData));
break;
case PAY:// leave table
- // MessageProducer wantToLeave =
- // session.createProducer(session.createQueue("LeftPizzaria"));
- // wantToLeave.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
- // wantToLeave.send(session.createObjectMessage(this));
+ GroupAgent.getInstance().getGroupcomm().send(new TableFree(groupData));
+ groupData.setState(GroupState.GONE);
break;
case GONE:
break; // do nothing.
// Waiter telling group he/she forwarded the order.
public void orderReceived(int waiter) {
groupData.setState(GroupState.ORDERED);
+ groupData.setState(GroupState.EATING); // TODO: skip pizza creation step
groupData.setOrderWaiter(waiter);
new Thread(this).start();
log.debug("orderReceived(): " + this);
public void deliverPizzas(Order order, int waiter) {
groupData.setState(GroupState.EATING);
groupData.setOrder(order);
- groupData.setPizzaWaiter(waiter);
+ groupData.setServingWaiter(waiter);
new Thread(this).start();
log.debug("bringOrderedPizzas(): " + this);
}
public int getId() {
return groupData.getId();
}
+
+ // pay for the pizzas and leave
+ public void payForPizzas(int waiter) {
+ groupData.setState(GroupState.PAY);
+ groupData.setPayingWaiter(waiter);
+ new Thread(this).start();
+ log.debug("payForPizzas(): " + this);
+ }
}
super(groupdata);
}
+ @Override
+ public String toString() {
+ return "OrderRequest []";
+ }
+
}
return waiterId;
}
+ @Override
+ public String toString() {
+ return "OrderResponse [waiterId=" + waiterId + "]";
+ }
+
}
--- /dev/null
+package at.ac.tuwien.sbc.valesriegler.group.actions;
+
+import java.io.Serializable;
+
+import at.ac.tuwien.sbc.valesriegler.types.GroupData;
+
+public class PayRequest extends AbstractAction implements Serializable {
+ public PayRequest(GroupData groupdata) {
+ super(groupdata);
+ }
+
+ @Override
+ public String toString() {
+ return "PayRequest []";
+ }
+
+}
--- /dev/null
+package at.ac.tuwien.sbc.valesriegler.group.actions;
+
+import java.io.Serializable;
+
+import at.ac.tuwien.sbc.valesriegler.types.GroupData;
+
+public class PayResponse extends AbstractAction implements Serializable {
+ private final int waiterId;
+
+ public PayResponse(GroupData groupdata, int waiterId) {
+ super(groupdata);
+ this.waiterId = waiterId;
+ }
+
+ public int getWaiterId() {
+ return waiterId;
+ }
+
+ @Override
+ public String toString() {
+ return "PayResponse [waiterId=" + waiterId + "]";
+ }
+
+}
--- /dev/null
+package at.ac.tuwien.sbc.valesriegler.group.actions;
+
+import java.io.Serializable;
+
+import at.ac.tuwien.sbc.valesriegler.types.GroupData;
+
+public class TableFree extends AbstractAction implements Serializable {
+ public TableFree(GroupData groupdata) {
+ super(groupdata);
+ }
+
+ @Override
+ public String toString() {
+ return "TableFree []";
+ }
+
+}
super(groupdata);
}
+ @Override
+ public String toString() {
+ return "TableRequest []";
+ }
+
}
return waiterId;
}
+ @Override
+ public String toString() {
+ return "TableResponse [table=" + table + ", waiterId=" + waiterId + "]";
+ }
+
}
import at.ac.tuwien.sbc.valesriegler.group.actions.AbstractAction;
import at.ac.tuwien.sbc.valesriegler.group.actions.OrderRequest;
import at.ac.tuwien.sbc.valesriegler.group.actions.OrderResponse;
+import at.ac.tuwien.sbc.valesriegler.group.actions.PayRequest;
+import at.ac.tuwien.sbc.valesriegler.group.actions.PayResponse;
+import at.ac.tuwien.sbc.valesriegler.group.actions.TableFree;
import at.ac.tuwien.sbc.valesriegler.group.actions.TableRequest;
import at.ac.tuwien.sbc.valesriegler.group.actions.TableResponse;
Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(orderresponse.getGroupdata().getId());
g.orderReceived(orderresponse.getWaiterId());
return;
+ } else if (obj instanceof PayResponse) {
+ PayResponse payresponse = (PayResponse) obj;
+ log.debug("Received: " + payresponse);
+ Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(payresponse.getGroupdata().getId());
+ g.payForPizzas(payresponse.getWaiterId());
+ return;
}
}
MessageProducer wantToSitAtTable = session.createProducer(session.createQueue("WantToSitAtTable"));
wantToSitAtTable.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
wantToSitAtTable.send(session.createObjectMessage(request));
- session.close();
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzariaConnector"));
+ MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
informPizzariaGui.send(session.createObjectMessage(request));
session.close();
return;
+
} else if (request instanceof OrderRequest) {
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageProducer wantToSitAtTable = session.createProducer(session.createQueue("WantToOrder"));
- wantToSitAtTable.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
- wantToSitAtTable.send(session.createObjectMessage(request));
+ MessageProducer wantToOrder = session.createProducer(session.createQueue("WantToOrder"));
+ wantToOrder.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ wantToOrder.send(session.createObjectMessage(request));
+
+ MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
+ informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ informPizzariaGui.send(session.createObjectMessage(request));
session.close();
+ return;
+
+ } else if (request instanceof PayRequest) {
+ Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageProducer wantToPay = session.createProducer(session.createQueue("WantToPay"));
+ wantToPay.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ wantToPay.send(session.createObjectMessage(request));
+
+ MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
+ informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ informPizzariaGui.send(session.createObjectMessage(request));
+ session.close();
+ return;
+
+ } else if (request instanceof TableFree) {
+ Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageProducer wantToSitAtTable = session.createProducer(session.createQueue("TablesFree"));
+ wantToSitAtTable.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ wantToSitAtTable.send(session.createObjectMessage(request.getGroupdata().getTable()));
+
+ request.getGroupdata().setTable(null);
+
+ MessageProducer wantToLeave = session.createProducer(session.createQueue("WantToLeave"));
+ wantToLeave.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ wantToLeave.send(session.createObjectMessage(request));
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzariaConnector"));
+ MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
informPizzariaGui.send(session.createObjectMessage(request));
session.close();
// if (args.length != 1) {
// throw new IllegalArgumentException(USAGE);
// } else {
- String mom = "XVSM";// args[0];
+// String mom = "XVSM";// args[0];
+ String mom = Util.useJMS ? "JMS" : "XVSM";
log.info(mom);
pizzeriaAgent = new PizzeriaAgent();
switch (mom) {
private Table table;
private Integer tableWaiter;
+
private Order order;
private Integer orderWaiter;
private Integer servingWaiter;
return orderWaiter;
}
+ public int getPayingWaiter() {
+ return payingWaiter;
+ }
+
@Deprecated
public List<PizzaType> getPizzas() {
return pizzas;
this.orderWaiter = orderWaiter;
}
+ public void setPayingWaiter(int payingWaiter) {
+ this.payingWaiter = payingWaiter;
+ }
+
@Deprecated
public void setPizzas(List<PizzaType> pizzas) {
this.pizzas = pizzas;
import org.slf4j.LoggerFactory;
import at.ac.tuwien.sbc.valesriegler.waiter.jms.messageListeners.WantToOrder;
+import at.ac.tuwien.sbc.valesriegler.waiter.jms.messageListeners.WantToPay;
import at.ac.tuwien.sbc.valesriegler.waiter.jms.messageListeners.WantToSitAtTable;
//TODO: needs a WaiterAgent and abstraction to support mzs + jms!
Session sessWantToOrder = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consWantToOrder = sessWantToOrder.createConsumer(sessWantToOrder.createQueue("WantToOrder"));
consWantToOrder.setMessageListener(new WantToOrder(this));
+
+ Session sessWantToPay = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageConsumer consWantToPay = sessWantToPay.createConsumer(sessWantToPay.createQueue("WantToPay"));
+ consWantToPay.setMessageListener(new WantToPay(this));
+
} catch (Exception e) {
log.error("Caught: ", e);
}
--- /dev/null
+package at.ac.tuwien.sbc.valesriegler.waiter.jms.messageListeners;
+
+import javax.jms.Connection;
+import javax.jms.DeliveryMode;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
+import javax.jms.ObjectMessage;
+import javax.jms.Session;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.ac.tuwien.sbc.valesriegler.group.actions.PayRequest;
+import at.ac.tuwien.sbc.valesriegler.group.actions.PayResponse;
+import at.ac.tuwien.sbc.valesriegler.waiter.Waiter;
+
+public class WantToPay implements MessageListener {
+ private static final Logger log = LoggerFactory.getLogger(WantToPay.class);
+ private final Waiter waiter;
+
+ public WantToPay(Waiter waiter) {
+ this.waiter = waiter;
+ }
+
+ @Override
+ public void onMessage(Message msg) {
+ try {
+ msg.acknowledge();
+ if (msg instanceof ObjectMessage) {
+ ObjectMessage objMsg = (ObjectMessage) msg;
+ Object obj = objMsg.getObject();
+
+ if (obj instanceof PayRequest) {
+ PayRequest payrequest = (PayRequest) obj;
+ log.debug("Received: " + payrequest);
+
+ // generate random delay
+ Thread.sleep((long) (Math.random() * 10000));
+
+ ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
+ Connection connection = connectionFactory.createConnection();
+ connection.start();
+ Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+ MessageProducer informGroup = session.createProducer(session.createQueue("GroupConnector"));
+ informGroup.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ PayResponse pr = new PayResponse(payrequest.getGroupdata(), waiter.getId());
+ informGroup.send(session.createObjectMessage(pr));
+
+ session.close();
+ connection.close();
+ } else {
+ log.warn("Received unknown Object: " + obj);
+ }
+ } else {
+ log.warn("Received unknown Message: " + msg);
+ }
+ } catch (JMSException e) {
+ log.error("EXCEPTION!", e);
+ } catch (InterruptedException e) {
+ log.error("EXCEPTION!", e);
+ }
+ }
+}
@Override
public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
List<GroupData> tables = (List<GroupData>) entries;
-// problem at the moment: Item type of groupoverviewmodel is Group and not GroupData
+// TODO problem at the moment: Item type of groupoverviewmodel is Group and not GroupData
}
};
public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
List<GroupData> groups = (List<GroupData>) entries;
- // when a groupdata is changed, call setItems on the groupoverviewmodel. problem at the moment: Item type of groupoverviewmodel is Group and not GroupData
+ // when a groupdata is changed, call setItems on the groupoverviewmodel. TODO problem at the moment: Item type of groupoverviewmodel is Group and not GroupData
}
};