]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/group/jms/JMSGroupConnector.java
[JMS] fairer benchmark.
[pub/jan/sbc.git] / src / main / java / at / ac / tuwien / sbc / valesriegler / group / jms / JMSGroupConnector.java
1 package at.ac.tuwien.sbc.valesriegler.group.jms;
2
3 import java.util.ArrayList;
4 import java.util.Date;
5 import java.util.HashMap;
6
7 import javax.jms.Connection;
8 import javax.jms.DeliveryMode;
9 import javax.jms.JMSException;
10 import javax.jms.Message;
11 import javax.jms.MessageConsumer;
12 import javax.jms.MessageListener;
13 import javax.jms.MessageProducer;
14 import javax.jms.ObjectMessage;
15 import javax.jms.Session;
16
17 import org.apache.activemq.ActiveMQConnectionFactory;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
20
21 import at.ac.tuwien.sbc.valesriegler.common.AbstractAction;
22 import at.ac.tuwien.sbc.valesriegler.cook.actions.DeliveryOrderInfo;
23 import at.ac.tuwien.sbc.valesriegler.driver.actions.OrderDeliveredInfo;
24 import at.ac.tuwien.sbc.valesriegler.group.AbstractGroupConnector;
25 import at.ac.tuwien.sbc.valesriegler.group.Group;
26 import at.ac.tuwien.sbc.valesriegler.group.GroupAgent;
27 import at.ac.tuwien.sbc.valesriegler.group.actions.DeliveryOrderRequest;
28 import at.ac.tuwien.sbc.valesriegler.group.actions.DeliveryOrderResponse;
29 import at.ac.tuwien.sbc.valesriegler.group.actions.OrderRequest;
30 import at.ac.tuwien.sbc.valesriegler.group.actions.OrderResponse;
31 import at.ac.tuwien.sbc.valesriegler.group.actions.PayRequest;
32 import at.ac.tuwien.sbc.valesriegler.group.actions.PayResponse;
33 import at.ac.tuwien.sbc.valesriegler.group.actions.TableFree;
34 import at.ac.tuwien.sbc.valesriegler.group.actions.TableRequest;
35 import at.ac.tuwien.sbc.valesriegler.group.actions.TableResponse;
36 import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
37 import at.ac.tuwien.sbc.valesriegler.waiter.actions.DeliverOrder;
38
39 /**
40  * This class handles the communication with other processes using JMS.
41  * 
42  * @author jan
43  * 
44  */
45 public class JMSGroupConnector extends AbstractGroupConnector implements MessageListener {
46         private static final Logger log = LoggerFactory.getLogger(JMSGroupConnector.class);
47         private static HashMap<String, JMSGroupConnector> connectors = new HashMap<String, JMSGroupConnector>();
48
49         public final String JMS_CONNECTSTRING;
50         private Connection connection;
51
52         public JMSGroupConnector(String address) {
53                 if (address == null)
54                         throw new IllegalArgumentException("Address may not be null!");
55                 JMS_CONNECTSTRING = address;
56                 init();
57         }
58
59         @Override
60         public void init() {
61                 try {
62                         connection = new ActiveMQConnectionFactory(JMS_CONNECTSTRING).createConnection();
63                         connection.start();
64                         Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
65                         MessageConsumer consumer = session.createConsumer(session.createQueue("GroupConnector"));
66                         consumer.setMessageListener(this);
67                 } catch (JMSException e) {
68                         log.error("EXCEPTION!", e);
69                 }
70         }
71
72         @Override
73         public void onMessage(Message msg) {
74                 try {
75                         msg.acknowledge();
76                         if (msg instanceof ObjectMessage) {
77                                 ObjectMessage objMsg = (ObjectMessage) msg;
78                                 Object obj = objMsg.getObject();
79
80                                 if (obj instanceof TableResponse) {
81                                         TableResponse tablerresponse = (TableResponse) obj;
82                                         log.debug("Received: " + tablerresponse);
83                                         Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(tablerresponse.getGroupdata().getId());
84                                         g.assignTable(tablerresponse.getTable(), tablerresponse.getWaiterId());
85                                         return;
86                                 } else if (obj instanceof OrderResponse) {
87                                         OrderResponse orderresponse = (OrderResponse) obj;
88                                         log.debug("Received: " + orderresponse);
89                                         Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(orderresponse.getGroupdata().getId());
90                                         g.orderReceived(orderresponse.getWaiterId());
91                                         return;
92                                 } else if (obj instanceof DeliverOrder) {
93                                         DeliverOrder deliverorder = (DeliverOrder) obj;
94                                         log.debug("Received: " + deliverorder);
95                                         Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(deliverorder.getGroupdata().getId());
96                                         g.deliverPizzas(deliverorder.getGroupdata().getOrder(), deliverorder.getWaiterId());
97                                         return;
98                                 } else if (obj instanceof PayResponse) {
99                                         PayResponse payresponse = (PayResponse) obj;
100                                         log.debug("Received: " + payresponse);
101                                         Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(payresponse.getGroupdata().getId());
102                                         g.payForPizzas(payresponse.getWaiterId());
103                                         return;
104
105                                 } else if (obj instanceof DeliveryOrderResponse) {
106                                         DeliveryOrderResponse deliveryOrderResponse = (DeliveryOrderResponse) obj;
107                                         log.debug("Received: " + deliveryOrderResponse);
108                                         deliveryOrderResponse.getDeliveryGroupData().setWaiterIdOfOrder(deliveryOrderResponse.getWaiterId());
109                                         ArrayList<DeliveryGroupData> gd = new ArrayList<DeliveryGroupData>();
110                                         gd.add(deliveryOrderResponse.getDeliveryGroupData());
111                                         GroupAgent.getInstance().getDeliveryModel().addDeliveries(gd);
112                                         return;
113
114                                 } else if (obj instanceof DeliveryOrderInfo) {
115                                         DeliveryOrderInfo deliveryOrderInfo = (DeliveryOrderInfo) obj;
116                                         log.debug("Received: " + deliveryOrderInfo);
117                                         ArrayList<DeliveryGroupData> gd = new ArrayList<DeliveryGroupData>();
118                                         gd.add(deliveryOrderInfo.getDeliveryGroupData());
119                                         GroupAgent.getInstance().getDeliveryModel().addDeliveries(gd);
120                                         return;
121
122                                 } else if (obj instanceof OrderDeliveredInfo) {
123                                         OrderDeliveredInfo orderDeliveredInfo = (OrderDeliveredInfo) obj;
124                                         log.debug("Received: " + orderDeliveredInfo);
125                                         orderDeliveredInfo.getDeliveryGroupData().setDriverId(orderDeliveredInfo.getDriverId());
126                                         ArrayList<DeliveryGroupData> gd = new ArrayList<DeliveryGroupData>();
127                                         gd.add(orderDeliveredInfo.getDeliveryGroupData());
128                                         GroupAgent.getInstance().getDeliveryModel().addDeliveries(gd);
129
130                                         if (GroupAgent.getInstance().getDeliveryModel().hasFinished()) {
131                                                 log.warn("Finished after {} seconds", new Date().getTime() - GroupAgent.startTime.get() / 1000);
132                                         }
133                                         return;
134                                 }
135
136                         }
137                         log.warn("Unknown messagetype received!");
138                 } catch (JMSException e) {
139                         log.error("EXCEPTION!", e);
140                 }
141         }
142
143         @Override
144         public void send(AbstractAction request) {
145                 try {
146                         if (request instanceof TableRequest) {
147                                 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
148                                 MessageProducer wantToSitAtTable = session.createProducer(session.createQueue("WantToSitAtTable"));
149                                 wantToSitAtTable.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
150                                 wantToSitAtTable.send(session.createObjectMessage(request));
151
152                                 MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
153                                 informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
154                                 informPizzariaGui.send(session.createObjectMessage(request));
155                                 return;
156
157                         } else if (request instanceof OrderRequest) {
158                                 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
159                                 MessageProducer wantToOrder = session.createProducer(session.createQueue("WantToOrder"));
160                                 wantToOrder.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
161                                 wantToOrder.send(session.createObjectMessage(request));
162                                 return;
163
164                         } else if (request instanceof PayRequest) {
165                                 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
166                                 MessageProducer wantToPay = session.createProducer(session.createQueue("WantToPay"));
167                                 wantToPay.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
168                                 wantToPay.send(session.createObjectMessage(request));
169                                 return;
170
171                         } else if (request instanceof TableFree) {
172                                 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
173                                 MessageProducer wantToSitAtTable = session.createProducer(session.createQueue("TablesFree"));
174                                 wantToSitAtTable.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
175                                 wantToSitAtTable.send(session.createObjectMessage(request.getGroupdata().getTable()));
176
177                                 MessageProducer wantToLeave = session.createProducer(session.createQueue("WantToLeave"));
178                                 wantToLeave.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
179                                 wantToLeave.send(session.createObjectMessage(request));
180
181                                 MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
182                                 informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
183                                 informPizzariaGui.send(session.createObjectMessage(request));
184                                 session.close();
185                                 return;
186
187                         } else if (request instanceof DeliveryOrderRequest) {
188                                 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
189                                 MessageProducer wantToPay = session.createProducer(session.createQueue("WantADelivery"));
190                                 wantToPay.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
191                                 wantToPay.send(session.createObjectMessage(request));
192
193                                 MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
194                                 informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
195                                 informPizzariaGui.send(session.createObjectMessage(request));
196                                 session.close();
197                                 return;
198                         }
199                 } catch (JMSException e) {
200                         log.error("EXCEPTION!", e);
201                 }
202         }
203
204         public static HashMap<String, JMSGroupConnector> getConnectors() {
205                 return connectors;
206         }
207
208         public static JMSGroupConnector getConnector(String key) {
209                 return connectors.get(key);
210         }
211
212         public Connection getConnection() {
213                 return connection;
214         }
215
216 }