Something went wrong on our end
SimpleServer.java 5.54 KiB
package mv3302;
import simkit.Priority;
import simkit.SimEntityBase;
import simkit.random.RandomVariate;
/**
* Class that simulates a simple server by extending SimEntityBase
*
* @author dansl
*/
public class SimpleServer extends SimEntityBase {
// Instance variables to hold the changing states during the simulation
protected int numberInQueue;
protected int numberAvailableServers;
protected int numberServed;
// Instance variables that hold the build settings of the simulation
private int totalNumberServers;
private RandomVariate serviceTimeGenerator;
/**
* Constructor method for the SimpleServer class; initializes the number of
* servers and service times for the simulation
*
* @param numberServers
* @param serviceTime
*/
public SimpleServer(int numberServers, RandomVariate serviceTime) {
totalNumberServers = numberServers;
serviceTimeGenerator = serviceTime;
}
/**
* Getter method for number of customers in the queue
*
* @return the numberInQueue
*/
public int getNumberInQueue() {
return numberInQueue;
}
/**
* Getter method for the number of servers available in the simulation
*
* @return the numberAvailableServers
*/
public int getNumberAvailableServers() {
return numberAvailableServers;
}
/**
* Getter method returns the total number of customers complete through the
* processing process
*
* @return the numberServed
*/
public int getNumberServed() {
return numberServed;
}
/**
* Getter method that returns the total number of servers in the simulation
*
* @return the totalNumberServers
*/
public int getTotalNumberServers() {
return totalNumberServers;
}
/**
* Setter method sets the total number of servers the simulation will use
*
* @param totalNumberServers
* @throws IllegalArgumentException if totalNumberServers <= 0 @ param
* totalNumberServers the totalNumberServers
*/
public void setTotalNumberServers(int totalNumberServers) {
if (totalNumberServers <= 0) {
throw new IllegalArgumentException("totalNumberServers must be > 0: "
+ totalNumberServers);
}
this.totalNumberServers = totalNumberServers;
}
/**
* Getter method that returns a service time value
*
* @return the serviceTimeGenerator
*/
public RandomVariate getServiceTimeGenerator() {
return serviceTimeGenerator;
}
/**
* setter method that sets a service time value
*
* @param serviceTimeGenerator the serviceTimeGenerator to set
*/
public void setServiceTimeGenerator(RandomVariate serviceTimeGenerator) {
this.serviceTimeGenerator = serviceTimeGenerator;
}
/**
* Reset method that returns the simulation to it's original state
*/
@Override
public void reset() {
super.reset();
numberInQueue = 0;
numberAvailableServers = totalNumberServers;
numberServed = 0;
}
/**
* Run method fires the state changes to update the listeners
*/
public void doRun() {
firePropertyChange("numberInQueue", getNumberInQueue());
firePropertyChange("numberAvailableServers", getNumberAvailableServers());
firePropertyChange("numberServed", getNumberServed());
}
/**
* Creates an arrival event, alters the total number of arrivals and
* schedules the next event
*/
public void doArrival() {
int oldNumberInQueue = getNumberInQueue();
numberInQueue = numberInQueue + 1;
firePropertyChange("numberInQueue", oldNumberInQueue, getNumberInQueue());
if (getNumberAvailableServers() > 0) {
waitDelay("StartService", 0.0, Priority.HIGH);
}
}
/**
* Method decreases the number of customers waiting in the queue and the
* number of available servers. Method then fires those changes for the
* listeners then schedules the EndService
*/
public void doStartService() {
int oldNumberInQueue = getNumberInQueue();
int oldNumberAvailableServers = getNumberAvailableServers();
numberAvailableServers = numberAvailableServers - 1;
numberInQueue = numberInQueue - 1;
firePropertyChange("numberInQueue", oldNumberInQueue, getNumberInQueue());
firePropertyChange("numberAvailableServers", oldNumberAvailableServers, getNumberAvailableServers());
waitDelay("EndService", getServiceTimeGenerator());
}
/**
* Method increases the number of customers that have been served and the
* number of available servers. Method then fires those changes for the
* listeners and schedules the StartService as long as the queue is greater
* than one.
*/
public void doEndService() {
int oldNumberAvailableServers = getNumberAvailableServers();
numberAvailableServers = numberAvailableServers + 1;
int oldNumberServed = getNumberServed();
numberServed = numberServed + 1;
firePropertyChange("numberAvailableServers", oldNumberAvailableServers, getNumberAvailableServers());
firePropertyChange("numberServed", oldNumberServed, getNumberServed());
if (getNumberInQueue() > 0) {
waitDelay("StartService", 0.0, Priority.HIGH);
}
}
}