-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathATM.java
More file actions
206 lines (173 loc) · 7.72 KB
/
ATM.java
File metadata and controls
206 lines (173 loc) · 7.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
package com.ibm.mq.samples.jms;
import java.io.Console;
import javax.jms.Destination;
import javax.jms.JMSConsumer;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.JMSProducer;
import javax.jms.TextMessage;
import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsFactoryFactory;
import com.ibm.msg.client.wmq.WMQConstants;
public class ATM {
// Create variables for the connection to MQ
static final String HOST = "localhost"; // Host name or IP address
static final int PORT = 1414; // Listener port for your queue manager
static final String CHANNEL = "DEV.APP.SVRCONN"; // Channel name
static final String QMGR = "QM1"; // Queue manager name
static final String APP_USER = "app"; // User name that application uses to connect to MQ
static final String APP_PASSWORD = "passw0rd"; // Password that the application uses to connect to MQ
//static final String QUEUE_NAME = "DEV.QUEUE.1"; // Queue that the application uses to put and get messages to and from
static JmsFactoryFactory ff = null;
static JmsConnectionFactory connectionFactory = null;
static int withdrawFee = 1;
static long atmID;
public static void main(String args[]){
try {
ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
connectionFactory = ff.createConnectionFactory();
}catch(Exception e){
System.out.println(e);
}
try {
// Set the properties
// connectionFactory.setStringProperty(WMQConstants.WMQ_HOST_NAME, HOST);
// connectionFactory.setIntProperty(WMQConstants.WMQ_PORT, PORT);
// connectionFactory.setStringProperty(WMQConstants.WMQ_CHANNEL, CHANNEL);
// connectionFactory.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
// connectionFactory.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, QMGR);
// connectionFactory.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, "ATM (JMS)");
// connectionFactory.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
// connectionFactory.setStringProperty(WMQConstants.USERID, APP_USER);
// connectionFactory.setStringProperty(WMQConstants.PASSWORD, APP_PASSWORD);
//connectionFactory.setStringProperty(WMQConstants.WMQ_SSL_CIPHER_SUITE, "*TLS12ORHIGHER");
// Create JMS objects
//context = connectionFactory.createContext();
IBM_MQ_Messager queue1 = new IBM_MQ_Messager("DEV.QUEUE.1");
//Send first message with ATM's ID
//destination = context.createQueue("queue:///" + QUEUE_NAME);
//producer = context.createProducer();
atmID = System.currentTimeMillis() % 1000;
TextMessage first_message = queue1.context.createTextMessage("ATM#"+atmID);
queue1.producer.send(queue1.destination, first_message);
System.out.println("Sent message: " + first_message);
//Recieve Bank's choice of individual channel
//consumer = context.createConsumer(destination);
String receivedMessage = queue1.consumer.receiveBody(String.class, 10000000); // in ms or 15 seconds
System.out.println("[BANK]: " + receivedMessage);
queue1.close();
String newDestination = receivedMessage;
//Write to the new channel that Bank delgated this ATM
IBM_MQ_Messager subscriber = new IBM_MQ_Messager("dev/");
Subscriber sub = new Subscriber(subscriber);
Thread subscriber_thread = new Thread(sub);
subscriber_thread.start();
IBM_MQ_Messager bank_queue = new IBM_MQ_Messager(newDestination);
//destination = context.createQueue("queue:///" + newDestination);
//producer = context.createProducer();
for(;;){
String input = System.console().readLine();
if(input == "stop" || input == "exit" || input == "quit"){
System.out.print("Stopping ATM Gracefully");
bank_queue.context.close();
System.exit(0);
}
//long uniqueNumber = System.currentTimeMillis() % 1000;
TextMessage message = bank_queue.context.createTextMessage("[ATM#" + ATM.atmID + "] : " + input);
bank_queue.producer.send(bank_queue.destination, message);
System.out.println("Sent message:\n" + message);
if(input.contains("withdraw")){
System.out.println("(Current withdraw fee: "+ ATM.withdrawFee + ")");
}
wait(1000);
/*consumer = context.createConsumer(destination);
receivedMessage = consumer.receiveBody(String.class, 15000); // in ms or 15 seconds
System.out.println(receivedMessage);*/
}
//consumer = context.createConsumer(destination); // autoclosable
//String receivedMessage = consumer.receiveBody(String.class, 15000); // in ms or 15 seconds
//System.out.println("\nReceived message:\n" + receivedMessage);
//recordSuccess();
} catch (Exception e) {
System.out.println(e);
}/*finally{
//queue1.context.close();
}*/
}
public static void wait(int ms){
try{
Thread.sleep(ms);
}catch(InterruptedException ex){
Thread.currentThread().interrupt();
}
}
}
class IBM_MQ_Messager {
//static final String QUEUE_NAME = "DEV.QUEUE.1"; // Queue that the application uses to put and get messages to and from
JMSContext context = null;
Destination destination = null;
JMSProducer producer = null;
JMSConsumer consumer = null;
String queue_name;
public IBM_MQ_Messager(String queue_name){
// Variables
this.context = null;
this.destination = null;
this.producer = null;
this.consumer = null;
this.queue_name = queue_name;
try {
// Set the properties
ATM.connectionFactory.setStringProperty(WMQConstants.WMQ_HOST_NAME, ATM.HOST);
ATM.connectionFactory.setIntProperty(WMQConstants.WMQ_PORT, ATM.PORT);
ATM.connectionFactory.setStringProperty(WMQConstants.WMQ_CHANNEL, ATM.CHANNEL);
ATM.connectionFactory.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
ATM.connectionFactory.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, ATM.QMGR);
ATM.connectionFactory.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, "ATM#" + ATM.atmID + " (JMS)");
ATM.connectionFactory.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
ATM.connectionFactory.setStringProperty(WMQConstants.USERID, ATM.APP_USER);
ATM.connectionFactory.setStringProperty(WMQConstants.PASSWORD, ATM.APP_PASSWORD);
//ATM.connectionFactory.setStringProperty(WMQConstants.WMQ_SSL_CIPHER_SUITE, "*TLS12ORHIGHER");
// Create JMS objects
context = ATM.connectionFactory.createContext();
if(queue_name.equals("dev/")){
destination = context.createTopic("dev/");
}else{
destination = context.createQueue("queue:///" + queue_name);
}
// long uniqueNumber = System.currentTimeMillis() % 1000;
// TextMessage message = context.createTextMessage("Your lucky number today is " + uniqueNumber);
if(!queue_name.equals("dev/")){ //subscriber won't need producer
producer = context.createProducer();
}
// producer.send(destination, message);
// System.out.println("Sent message:\n" + message);
consumer = context.createConsumer(destination); // autoclosable
// String receivedMessage = consumer.receiveBody(String.class, 15000); // in ms or 15 seconds
System.out.println("CONNECTED to " + queue_name + ".");
// System.out.println("\nReceived message:\n" + receivedMessage);
} catch(Exception e){
System.out.print(e);
}
}
public void close(){
System.out.println("DISCONNECTED from " + queue_name + ".");
context.close();
}
}
class Subscriber implements Runnable{
IBM_MQ_Messager subscriber;
public Subscriber(IBM_MQ_Messager subscriber){
this.subscriber = subscriber;
}
@Override
public void run(){
for(;;){
String receivedMessage = subscriber.consumer.receiveBody(String.class, 10000000); // in ms or 15 seconds
System.out.println("[BANK] : " + receivedMessage);
if(receivedMessage.contains("increase")){
System.out.println("Withdraw Fee raised to: " + (++ATM.withdrawFee));
}
}
}
}